【问题标题】:Merging collection arrays [closed]合并集合数组
【发布时间】:2015-08-04 07:16:13
【问题描述】:

我正在寻找一种方法来获取这个数组。

[
  {
    "alpha": ['a', 'b', 'c'],
    "beta": ['d', 'e', 'f'] 
  },
  {
    "alpha": ['h', 'i', 'j'],
    "beta": ['k', 'l', 'm']  
  }
]

并将其转化为这个对象。

{
  "alpha": ['a', 'b', 'c', 'h', 'i', 'j']
  "beta": ['d', 'e', 'f', 'k', 'l', 'm']  
}

最好使用 lodash 或下划线。最好的方法是什么?

【问题讨论】:

  • “最佳”是什么意思?在什么方面?速度还是资源消耗?
  • @Raptor Simplicity, api, spec.
  • 一般来说,你有一个对象数组,其中每个对象都有相同的键但唯一的值。你想连接属于相同键的值吗?
  • 为什么要用下划线js呢?
  • @eugensunic 我不明白我为什么不这样做。

标签: javascript arrays object underscore.js lodash


【解决方案1】:

我会走这条路:

var or = [
  {
    "alpha": ['a', 'b', 'c'],
    "beta": ['d', 'e', 'f'] 
  },
  {
    "alpha": ['h', 'i', 'j'],
    "beta": ['k', 'l', 'm']  
  }
];

var res = {
    "alpha": _.union(or[0].alpha, or[1].alpha)
    "beta": _.union(or[0].beta, or[1].beta)
}

【讨论】:

    【解决方案2】:

    如果您有规范数组和对象,请执行以下操作:

    var arr = [
        {
            "alpha": ['a', 'b', 'c'],
            "beta": ['d', 'e', 'f']
        },
        {
            "alpha": ['h', 'i', 'j'],
            "beta": ['k', 'l', 'm']
        }
    ];
    
    var obj = new Object();
    
    arr.forEach(function(el) {
        for (key in el) {
            if (el.hasOwnProperty(key)) {
                if (!obj.hasOwnProperty(key)) {
                    obj[key] = [];
                }
                obj[key] = obj[key].concat(el[key]);
            }
        }
    });
    
    console.log(obj);

    【讨论】:

      【解决方案3】:

      一种简单的方法是在数组上使用concat 方法,如下所示:

      var array = [
        {
          "alpha": ['a', 'b', 'c'],
          "beta": ['d', 'e', 'f'] 
        },
        {
          "alpha": ['h', 'i', 'j'],
          "beta": ['k', 'l', 'm']  
        }
      ]
      
      var mergedAlphaArray = array[0].alpha.concat(array[1].alpha);
      var mergedBetaArray = array[0].beta.concat(array[1].beta);
      

      这会将两个数组合并为一个。

      【讨论】:

        【解决方案4】:

        这是我使用下划线得出的结论。

        var sets = [
          {
            "alpha": ['a', 'b', 'c'],
            "beta": ['d', 'e', 'f'] 
          },
          {
            "alpha": ['h', 'i', 'j'],
            "beta": ['k', 'l', 'm']  
          }
        ]
        
        var full = _.mapObject(sets[0], function (set, key) {
          var result =  _.chain(sets)
          .map(function(set){
            return _.chain(set)
            .pick(key)
            .values()
            .value()
          })
          .value()
          return _.flatten(result)
        })
        
        console.log(full)
        

        【讨论】:

          【解决方案5】:

          这里是通用解决方案,适用于动态数组长度。

          var arr = [
              {
                  "alpha": ['a', 'b', 'c'],
                  "beta": ['d', 'e', 'f']
              },
              {
                  "alpha": ['h', 'i', 'j'],
                  "beta": ['k', 'l', 'm']
              }
          ];
          
           function merge(data) {
            var alphaArr = [],
                betaArr = [];
            for (var i = 0; i < arr.length; i++) {
                Array.prototype.push.apply(alphaArr, arr[i].alpha);
                Array.prototype.push.apply(betaArr, arr[i].beta);
            }
            return {
                "alpha": alphaArr,
                "beta": betaArr
               }
            }
          

          【讨论】:

            【解决方案6】:

            如果您正在寻找 jQuery 版本...

            var finals = [];
            $.each(test, function(k, v) {
                $.each(v, function(key, val) {
                    if(finals[key] == undefined) {
                        finals[key] = val;
                    } else {
                        finals[key] = finals[key].concat(val);
                    }
                });
            });
            console.log(finals);
            

            这并没有指定数组键的名称,这提供了灵活性。

            工作演示:JSFiddle

            【讨论】:

              猜你喜欢
              • 2017-03-07
              • 2018-07-17
              • 2011-04-13
              • 2018-09-22
              • 1970-01-01
              • 2011-10-14
              • 2020-11-26
              • 2018-07-22
              • 2021-08-16
              相关资源
              最近更新 更多