javascript - 通过与另一个对象部分匹配来查找对象

标签 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 属性(糟糕的数据库合并的结果)。

每位客户:

  • 至少具有以下属性之一
  • 可能拥有所有三个 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/

相关文章:

javascript - Cordova HTTP插件: postJSON not a function

php - JQuery 数组和输入复选框+隐藏

javascript - 如何在我的 nodejs 编码中使用 promise 链

javascript - 不可变的 : find if map contains key value

javascript - 如何使用 Sinon/Qunit 模拟 'timeout' 或 'failure' 响应?

javascript - 通过带有下划线的多个属性对对象数组进行分组

javascript - 下划线将对象转换为数组并按键名排序

javascript - 根据数组中的位置从数组中获取代表元素

javascript - 如何在 ImmutableJS Record 的扩展类上使用 setter

javascript - 为什么我不应该在 React Redux 中使用 toJS() ? (mapStateToProps)