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]!==未定义的
vs
typeof 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]));