【问题标题】:Merge two arrays by grouping based on elements of 1st array in Javascript通过基于Javascript中第一个数组的元素进行分组来合并两个数组
【发布时间】:2016-06-12 03:20:26
【问题描述】:

我有两个这样的数组(arr1 和 arr2)

var arr1 = ["A","B","C"];

var arr2 = [["A","aa"], ["A","ab"], ["A","ac"],["B","ba"],["B","bb"],["B","bc"],["C","ca"],["C","cb"]];

我想根据第一个数组的值将它们组合成 javascript 中的第三个数组。期望的输出:

arr3 = [ ["A",["aa","ab","ac"]], ["B",["ba","bb","bc"] ], ["C",["ca","cb"]] ]

注意:我从 arr2 开始,并且能够检索第一个值并将重复项删除到 arr1。

请指教。

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    这样试试

    var arr1 = ["A", "B", "C"];
    
    var arr2 = [
      ["A", "aa"],
      ["A", "ab"],
      ["A", "ac"],
      ["B", "ba"],
      ["B", "bb"],
      ["B", "bc"],
      ["C", "ca"],
      ["C", "cb"]
    ];
    var newVal = arr1.map(function(x) {
      var filter = arr2.filter(function(y) {
        return y[0] == x;
      }).map(function(y) {
        return y[1];
      });
      return [x, filter];
    })
    console.log(newVal);
    

    DEMO

    【讨论】:

      【解决方案2】:

      注意:我从 arr2 开始,并且能够检索第一个值并将重复项删除到 arr1。

      与其创建arr1 作为中间步骤,我可能会创建一个对象作为中间步骤:

      var obj = arr2.reduce(function(a,b){
        if (!a[b[0]]) a[b[0]] = [];
        a[b[0]].push(b[1]);
        return a;
      },{});
      
      // obj is now {"A":["aa","ab","ac"],"B":["ba","bb","bc"],"C":["ca","cb"]}
      

      将该对象转换为所需的输出数组:

      var arr3 = Object.keys(obj).map(function(v) { return [v, obj[v]]; });
      // [["A",["aa","ab","ac"]],["B",["ba","bb","bc"]],["C",["ca","cb"]]]
      

      如果您确实需要 arr1 数组来做其他事情,那么:

      var arr1 = Object.keys(obj);
      // ["A", "B", "C"]
      

      但请注意,obj 对于进一步处理非常有用,因为如果您需要获取与 "B" 关联的值,则无需再次搜索数组,您可以简单地说 obj["B"](其中将给出数组["ba","bb","bc"])。所以第二个"B" 值是obj["B"][1]

      进一步阅读:

      【讨论】:

        猜你喜欢
        • 2013-09-26
        • 2022-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多