我有以下数据:
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
}
})
})
但我一直在寻找更优雅的解决方案。 我也在使用underscorejs。
注意:这是 Immutable.js 集合/映射/列表的 POJO 版本。如果使用 Immutable.js 可以实现同样的事情那就太好了:)
最佳答案
如果我正确地阅读了您的问题,搜索应该会找到与搜索
上的任何非未定义
键/值对匹配的内容> 对象(而不是全部)。
如果是这样,您可以通过找出这些键一次来提高效率,并在找到匹配项后停止循环:
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] &&
,因为我们在开始搜索之前会过滤掉具有 未定义
值的键,因此如果该项目不需要如果没有 key ,item[key]
不会与 search[key]
匹配 ===
。
这是一个live example使用 Babel 的 REPL 上的示例数据创建 ES2015 版本。
关于javascript - 通过与另一个对象部分匹配来查找对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35430681/