想要合并一个对象数组,从而产生唯一键和值数组的对象(值的重复是可以的)。香草JS或lodash的解决方案首选。
例如 - 从这个:
[{
a: 1,
b: 2
}, {
a: 1,
c: 3
}]
到此:
{
a: [1, 1],
b: [2],
c: [3]
}
答案 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;
答案 1 :(得分:1)
ES6变体:
angular.module('myApp', [])
.controller('mainController', ['$scope',
function($scope) {
$scope.state = true;
}
]);
&#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
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;