通过与另一个对象的部分匹配来查找对象
Find object by partial match with another object
我有以下数据:
let Collection = [{
id: '1',
uid: 'u1',
rci: 'r1',
name: 'ClientName'
}, {
uid: 'u2',
name: 'ClientName 2'
}, {
rci: 'r3',
name: 'ClientName 3'
}]
id、uid 和 rci 是三种不同的 id 属性(由糟糕的数据库合并导致(。
每个客户:
- 至少具有以下属性之一
- 可能同时具有所有三个ID
现在的问题:我必须使用如下所示的对象搜索此集合:
search: {
id: undefined,
uid: 'u3',
rci: 'r3'
}
它与集合中的第三个条目匹配,因为 RCI 属性匹配。
显然,有这个解决方案:
let match;
let test = Collection.forEach(item => {
Object.keys(search).forEach(key => {
console.log('iteration')
if(item[key] && item[key] === search[key]) {
match = item
}
})
})
但我正在寻找一个更优雅的解决方案。我也在使用下划线js。
注意:这是不可变.js集合/映射/列表的POJO版本。如果同样的事情可以用不可变实现.js那将是很好的:)
如果我
没看错你的问题,搜索应该找到与search
对象(而不是全部(上任何非undefined
键/值对匹配的内容。
如果是这样,您可以通过一次弄清楚这些键是什么,并在找到匹配项后停止循环来提高效率:
let keys = Object.keys(search).filter(key => search[key] !== undefined);
let match = _.find(Collection, item => keys.some(key => item[key] === search[key]));
从 ES2015(又名 ES6(开始,或者带有用于Array#find
的垫片,不需要下划线:
let keys = Object.keys(search).filter(key => search[key] !== undefined);
let match = Collection.find(item => keys.some(key => item[key] === search[key]));
我们不需要您拥有的item[key] &&
,因为我们在开始搜索之前会过滤掉具有undefined
值的键,因此如果项目没有键,item[key]
将不会是search[key]
===
匹配项。
下面是 ES2015 版本的一个实时示例,它使用了您在 Babel 的 REPL 上的示例数据。
在普通的Javascript中,您可以使用Array#filter()
和Array#some()
。
function find(array, search) {
var s = {};
Object.keys(search).forEach(function (k) {
if (typeof search[k] !== 'undefined') {
s[k] = search[k];
}
});
return array.filter(function (a) {
return Object.keys(s).some(function (k) {
return s[k] === a[k];
});
});
}
var collection = [{ id: '1', uid: 'u1', rci: 'r1', name: 'ClientName' }, { uid: 'u2', name: 'ClientName 2' }, { rci: 'r3', name: 'ClientName 3' }],
result = find(collection, { id: undefined, uid: 'u3', rci: 'r3' });
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
相关文章:
- Javascript:根据对象的嵌套数组中的值,在数组中查找对象的索引
- 正在数组中查找对象
- 在prototypejs中查找对象的类
- 通过知道对象的id在JSON中查找对象
- Javascript在JSON中查找对象(我使用Angular)
- 查找对象数组是否包含其中一个标记的最快方法
- 如何将查找对象值传递到FetchXml查询中
- JavaScript-通过类似的属性查找对象,并将其推送到一个新的数组中
- 通过匹配 - Javascript/AngularJS 中的参数来查找对象
- 正在查找对象集合的最大值
- 根据Angular JS中的属性值在列表中查找对象
- 在下划线中的对象中查找对象中的重复项
- 如何使用正则表达式查找对象成员名称
- 通过包含的字符串查找对象
- 在 Firebase 中通过对象的唯一 id 查找对象
- 在 javascript 中查找对象的类型
- 查找对象树中特定字段值的所有出现
- 如何在javascript数组中按键和值查找对象的索引
- 使用 Javascript/React.js 查找对象的数组索引
- 查找对象数组(Angularjs)中是否存在值