Javascript 通过与另一个对象的部分匹配查找对象
我有以下数据:Javascript 通过与另一个对象的部分匹配查找对象,javascript,underscore.js,immutable.js,Javascript,Underscore.js,Immutable.js,我有以下数据: let Collection = [{ id: '1', uid: 'u1', rci: 'r1', name: 'ClientName' }, { uid: 'u2', name: 'ClientName 2' }, { rci: 'r3', name: 'ClientName 3' }] id、uid和rci是三个不同的id属性(由于糟糕的数据库合并) 每位客户: 至少具有其中一个属性 可能有三
let Collection = [{
id: '1',
uid: 'u1',
rci: 'r1',
name: 'ClientName'
}, {
uid: 'u2',
name: 'ClientName 2'
}, {
rci: 'r3',
name: 'ClientName 3'
}]
id、uid和rci是三个不同的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
}
})
})
但我在寻找一个更优雅的解决方案。
我也在使用下划线
注意:这是Immutable.js集合/映射/列表的POJO版本。如果同样的事情可以通过Immutable.js实现,那就太好了:)在普通Javascript中,您可以使用和
函数查找(数组、搜索){
var s={};
Object.keys(搜索).forEach(函数(k){
如果(搜索类型[k]!==‘未定义’){
s[k]=搜索[k];
}
});
返回数组.filter(函数(a){
返回Object.keys.some(函数k){
返回s[k]==a[k];
});
});
}
var collection=[{id:'1',uid:'u1',rci:'r1',name:'ClientName'},{uid:'u2',name:'ClientName 2'},{rci:'r3',name:'ClientName 3'}],
结果=查找(集合,{id:undefined,uid:'u3',rci:'r3'});
document.write(“”+JSON.stringify(结果,0,4)+“”)
如果我没有看错你的问题,搜索应该在搜索
对象上找到与任何非未定义的键/值对匹配的内容(而不是全部)
如果是这样,您可以通过一次计算出这些键是什么,并在找到匹配项后停止循环来提高效率:
let keys = Object.keys(search).filter(key => search[key] !== undefined);
let match = Collection.find(item => keys.some(key => item[key] === search[key]));
从ES2015(又称ES6)起,或使用数组#find
的垫片,不需要下划线:
我们不需要您拥有的项[key]&&
,因为我们在开始搜索之前过滤掉了带有未定义的值的项,因此如果项没有键,项[key]
将不会是搜索[key]
的匹配项
这是一个ES2015版本的示例,使用您在Babel回复中的样本数据。“如果(item[key]&&item[key]==search[key]){
“您的搜索值都不能为零?(或任何其他虚假值?)@T.J.Crowder通常id不能为零。但是,坏DB,谁知道呢…还没有检查它是否符合您的要求,但是下划线有一个IsMatch
函数:@Me.Name:Nope,因为他的示例search
与第三个条目不匹配,因为第三个条目只有rci
,而没有uid
或id
ust一个关于search[key]!==未定义的vstypeof search[k]的简短问题!=='undefined'
。在这种情况下,什么更好?@NinaScholz:我认为这在当今世界并不重要。undefined
全局现在是只读的。很久以前,一个窗口中的undefined
存在一个问题,而另一个窗口中的==='code>undefined
。然而,它仍然(遗憾地)存在可能会隐藏符号未定义
,因此,如果您正在编写一个通用库,该库可能会在您无法控制的范围内执行,而某人可能做了一些疯狂的事情,如var undefined=42
,您可能希望对此进行防御。(续)(续)通常在这种情况下,您无论如何都有一个作用域函数(因此您可以使用特定于库的私有全局变量),它提供了一种处理这种防御的简单方法:(函数(未定义){…}();
我始终确保我可以信任未定义的,因此我不必使用较长的类型的检查。
let keys = Object.keys(search).filter(key => search[key] !== undefined);
let match = Collection.find(item => keys.some(key => item[key] === search[key]));