【问题标题】:Two arrays of objects need to filter the one based on the others key两个对象数组需要根据其他键过滤一个
【发布时间】:2016-05-18 00:28:08
【问题描述】:

我有两个对象数组,如下所示:

var array1 = [{"id": "-1","OwnerID": 777,"Admin": "true"},{"id": "-1","OwnerID": 555,"Admin": "true"},{"id": "-1","OwnerID": 444,"Admin": "true"},{"id": "-1","OwnerID": 222,"Admin": "true"},{"id": "-1","OwnerID": 111,"Admin": "true"}];

var array2 = [{"id": 777, "OwnerName": "Blah", "OwnerType": "Test"},{"id": 555, "OwnerName": "Blah", "OwnerType": "Test"},{"id": 444, "OwnerName": "Blah", "OwnerType": "BusinessMan"},{"id": 222, "OwnerName": "Blah", "OwnerType": "BusinessMan"},{"id": 111, "OwnerName": "Blah", "OwnerType": "BusinessMan"},{"id": 234, "OwnerName": "Blah", "OwnerType": "BusinessMan"},{"id": 432, "OwnerName": "Blah", "OwnerType": "Test"},{"id": 112, "OwnerName": "Blah", "OwnerType": "BusinessMan"},{"id": 114, "OwnerName": "Blah", "OwnerType": "Test"}]

我需要得到一个经过过滤的array1 数组,其中array2 中的OwnerType 是Test。 array1 中的 OwnerID 链接到数组 2 中的 id。我希望用尽可能少的行来执行此操作。理想情况下,我主要想看看数组长度是否大于 1,因为第一个数组应该只有一个这种类型。任何帮助表示赞赏。

编辑:

所需的输出应该是 array1 看起来像:

[{"id": "-1","OwnerID": 777,"Admin": "true"},{"id": "-1","OwnerID": 555,"Admin": "true"}]

【问题讨论】:

  • 您能否提供一个your_function(array1, array2) 所需输出的示例?
  • @epascarello 我已经尝试过,我只是很难理解如何使用 2 个数组来做到这一点:|
  • 我对你的问题感到困惑,你说“......数组2中的 OwnerType 是测试”。我在您的示例中没有看到“测试”,也没有看到您预期的输出数组......
  • @Himmel 是的,将对象保留在数组 1 中的决定因素是 array2 是否具有键 OwnerType: 测试并加入两个数组是 array1 的 OwnerID 和 array2 的 id

标签: javascript arrays ecmascript-6


【解决方案1】:

两个嵌套的for循环应该很容易解决:

var array_result = [];

for(var i = 0; i < array1.length; i++){
    for(var j = 0; j < array2.length; j++){
        if(array2[j].id == array1[i].OwnerID && array2[j].OwnerType == "Test")
            array_result.push(array1[i]);
    }
}

如果 array2 是一个关联数组,以 id 作为键,则过滤的复杂性可以大大降低。

【讨论】:

    【解决方案2】:

    因此,首先您要返回 array2 中具有匹配 id (array1) 和 OwnerID (array2) 值的所有对象。

    // array of `OwnerID` values
    var idArr = array1.map(function(obj) { return obj.OwnerID; });
    

    然后,您只从 array2 获得具有匹配 id 的对象(与 array1 OwnerID 和具有 OwnerTypeTest 的对象。

    // filter array2 by matches
    var matches = array2.map(function(obj) { 
      return idArr.indexOf(obj.id) > -1 && obj.OwnerType === 'Test'; 
    });
    

    结果matches 将是一个对象数组,其中包含正确的idOwnerTypeTest

    【讨论】:

      【解决方案3】:

      我最终使用的答案

      array1.filter(ar1 => array2.filter(ar2 => ar2.OwnerType == 'Test' && ar2.id == ar1.OwnerID).length > 0).length > 1
      

      感谢大家对此的帮助

      【讨论】:

        猜你喜欢
        • 2021-03-21
        • 2020-12-14
        • 1970-01-01
        • 2013-10-08
        • 2017-02-07
        • 2019-09-30
        • 1970-01-01
        • 2021-10-24
        • 2022-11-30
        相关资源
        最近更新 更多