javascript合并对象数组,在数组

时间:2017-07-05 06:56:09

标签: javascript lodash

想要合并一个对象数组,从而产生唯一键和值数组的对象(值的重复是可以的)。香草JS或lodash的解决方案首选。

例如 - 从这个:

[{ 
  a: 1, 
  b: 2 
}, { 
  a: 1, 
  c: 3 
}]

到此:

{ 
  a: [1, 1],
  b: [2],
  c: [3]
}

5 个答案:

答案 0 :(得分:2)

您可以_.mergeWith()使用spread syntax来组合对象:



const data = [{"a":1,"b":2},{"a":1,"c":3}];

const result = _.mergeWith({}, ...data, (v1, v2) => {
  const arr = (v1 || []);
  arr.push(v2);
  return arr;
});

console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

ES6变体:

&#13;
&#13;
    angular.module('myApp', [])
            .controller('mainController', ['$scope',
                function($scope) {
                    $scope.state = true;
                }
            ]);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

没有装载:

require("ice")

答案 3 :(得分:0)

在堆栈中快速搜索显示@elclanrs已经为here编写了代码但是根据注释,它需要稍微调整才能接受一个对象数组,所以我添加了一些更改原始代码本身。

所以基本上它可以归结为函数调用:

var merge = function() {
  return [].reduce.call(arguments, function(acc, x) {
  for(i=0;i<x.length;i++){
    Object.keys(x[i]).forEach(function(k) {
      acc[k] = (acc[k]||[]).concat([x[i][k]])
    });
    }
    return acc
  },{})
}
}

这是一个使用函数调用的片段(我放了一些小改动):

var x = [{a: 1, b: 2}, {a: 1,c: 3}]

var merge = function() {
  return [].reduce.call(arguments, function(acc, x) {
  for(i=0;i<x.length;i++){
    Object.keys(x[i]).forEach(function(k) {
      acc[k] = (acc[k]||[]).concat([x[i][k]])
    });
    }
    return acc
  },{})
}

y = merge(x);

alert(JSON.stringify(y));

答案 4 :(得分:0)

您可以使用lodash#mergeWith中包含的lodash#spread使lodash#mergeWith将数组视为参数列表。我们使用lodash#concat作为支持函数来连接空对象(以避免改变集合中的对象),集合以及合并整个集合的自定义程序函数。自定义程序由lodash#flow组成,其中第一个参数为lodash#concat,仅使用lodash#ary接受2的arity,第二个参数使用lodash#compact - 它会删除所有{ {1}}数组中的值。

undefined

&#13;
&#13;
var result = _.spread(_.mergeWith)(
  _.concat({}, data, _.flow(_.ary(_.concat, 2), _.compact))
);
&#13;
var data = [{
  "a": 1,
  "b": 2
}, {
  "a": 1,
  "c": 3
}];

var result = _.spread(_.mergeWith)(
  _.concat({}, data, _.flow(_.ary(_.concat, 2), _.compact))
);

console.log(result);
&#13;
&#13;
&#13;