【问题标题】:Lodash filtering/intersection of two object arrays in JavascriptJavascript中两个对象数组的Lodash过滤/交集
【发布时间】:2019-05-13 18:07:09
【问题描述】:

我有两个对象数组。在第二个数组中,您可以从第一个数组中分配一个 id。如果第一个数组的 id 未在 array2 中关联,我如何过滤第一个数组以仅显示结果?我已经在 lodash 中尝试了一个过滤器的嵌套过滤器,以及一个 find 的过滤器,但它只是不起作用。

这是我尝试过的:

array1.filter(item => item.id === find(array2, { associatedID: item.id })[0].associatedID) 在过滤器中查找的第二次迭代。我尝试了类似的过滤方法而不是 find,但这也不起作用。在 find 函数中使用 item.id 是否存在问题,因为它是从父过滤器参数提供的?还是没有?

帮助?

const array1 = [{
  "id": "1",
  "name": "Test 1"
},
{
  "id": "2",
  "name": "Test 2",
}
{
  "id": "3",
  "name": "Test 3",
}
]

const array2 = [{
  "id": "12",
  "name": "Test 1",
  "associatedID": "1"
},
{
  "id": "22",
  "name": "Test 2",
  "associatedID": "2"
}
{
  "id": "32",
  "name": "Test 3",
}
]

【问题讨论】:

  • 与其要求我们从头开始编写代码,不如分享您已经尝试过的内容。
  • 请使用请求的信息更新问题,而不是将其添加为评论。

标签: javascript arrays object lodash


【解决方案1】:

非性能方法是

array1.filter(elm1 => {
  return array2.find(elm2 => elm2.associatedID === elm1).length === 1
})

如果您的数组很大,您可以根据 id 和 associatedID 对两个数组进行排序,并在它们上运行一个 for 循环以某种方式返回结果

【讨论】:

    【解决方案2】:

    使用lodash的_.differenceWith()array获取所有在array2中没有associatedID的项目:

    const array1 =[{"id":"1","name":"Test 1"},{"id":"2","name":"Test 2"},{"id":"3","name":"Test 3"}]
    
    const array2 = [{"id":"12","name":"Test 1","associatedID":"1"},{"id":"22","name":"Test 2","associatedID":"2"},{"id":"32","name":"Test 3"}]
    
    const result = _.differenceWith(array1, array2, 
      ({ id }, { associatedID }) => id === associatedID
    );
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

    【讨论】:

      【解决方案3】:

      只需使用Array.filterArray.somearray1 获取与array2 无关的项目:

      const array1 = [{ "id": "1", "name": "Test 1" }, { "id": "2", "name": "Test 2", }, { "id": "3", "name": "Test 3", } ]
      const array2 = [{ "id": "12", "name": "Test 1", "associatedID": "1" }, { "id": "22", "name": "Test 2", "associatedID": "2" }, { "id": "32", "name": "Test 3", } ]
      
      const result = array1.filter(x => !array2.some(y => y.associatedID == x.id))
      console.log(result)

      使用 lodash 也可以通过 _.differenceWith 完成:

      const array1 = [{ "id": "1", "name": "Test 1" }, { "id": "2", "name": "Test 2", }, { "id": "3", "name": "Test 3", } ]
      const array2 = [{ "id": "12", "name": "Test 1", "associatedID": "1" }, { "id": "22", "name": "Test 2", "associatedID": "2" }, { "id": "32", "name": "Test 3", } ]
      
      const result = _.differenceWith(array1, array2, (x,y) => x.id === y.associatedID)
      console.log(result)
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-22
        • 1970-01-01
        • 2015-07-10
        • 2021-05-16
        • 2018-09-06
        相关资源
        最近更新 更多