在不覆盖现有键值的情况下将对象的值添加到对象数组
Adding the values from an object to an array of objects without overriding existing key values
你如何看待这个:
var array = [{key: [3]}, {key1: [3]}, {key1: [3]}]
var object = {key1: [3], key2: [3]};
对此:
{key: [3], key1: [9], key2: [3]}
所有 "key" 都是类似 "LQVjUacPgK" 的用户 ID,如下面的 obj 示例所示。
[N] = 是一个包含 N 个对象的数组,每个对象中有大约 10 个键值对。
N = {obj, obj, obj};
obj = {_account: "JDQEPxoy3ktZRP9VEzAMtXLa7rXXedhQ4bARq"
_id: "oQER3vznDwikxm1wdLzJFdVjKL6XomcORMxDL"
amount: 170
category: Array[2]
category_id: "21003000"
date: "2015-06-09"Object
type: Object
userId: "LQVjUacPgK"}
现在我正在这样做:
var test = _.reduce(_.flatten(array.concat([object])),function(a,b){
return _.extend(a, b);
});
}
};
并得到这个结果:
console.log(test)//{key: [3], key1: [3], key2: [3]}
明确地说,问题是 key1 在所有对象之间具有不同的值。我想保留两者的值,以便 key1: [9].
这不是下划线答案,但基本上我不会为此使用 reduce 操作,而是做一个简单的 for-each:
var array = [{key: [3]}, {key1: [3]}, {key1: [3]}]
var object = {key1: [3], key2: [3]};
array.forEach(function(current) {
Object.keys(current).forEach(function(name) {
// object[name] = [((object[name] || [])[0] || 0) + current[name][0]];
object[name] = (object[name] || []).concat(current[name]);
});
});
console.log(JSON.stringify(object)); // {"key1":[3,3,3],"key2":[3],"key":[3]}
类似于杰克的答案(也是非下划线),但它创建了一个新对象,它不会修改现有的 object Object:
var array = [{key: [3]}, {key1: [3]}, {key1: [3]}]
var object = {key1: [3], key2: [3]};
var x = array.concat([object]).reduce(function(prev, curr) {
Object.keys(curr).forEach(function(key){
if (prev.hasOwnProperty(key)) {
prev[key][0] += curr[key][0];
} else {
prev[key] = curr[key];
}
});
return prev;
},{});
console.log(JSON.stringify(x)); // {"key":[3],"key1":[9],"key2":[3]}
你如何看待这个:
var array = [{key: [3]}, {key1: [3]}, {key1: [3]}]
var object = {key1: [3], key2: [3]};
对此:
{key: [3], key1: [9], key2: [3]}
所有 "key" 都是类似 "LQVjUacPgK" 的用户 ID,如下面的 obj 示例所示。
[N] = 是一个包含 N 个对象的数组,每个对象中有大约 10 个键值对。
N = {obj, obj, obj};
obj = {_account: "JDQEPxoy3ktZRP9VEzAMtXLa7rXXedhQ4bARq"
_id: "oQER3vznDwikxm1wdLzJFdVjKL6XomcORMxDL"
amount: 170
category: Array[2]
category_id: "21003000"
date: "2015-06-09"Object
type: Object
userId: "LQVjUacPgK"}
现在我正在这样做:
var test = _.reduce(_.flatten(array.concat([object])),function(a,b){
return _.extend(a, b);
});
}
};
并得到这个结果:
console.log(test)//{key: [3], key1: [3], key2: [3]}
明确地说,问题是 key1 在所有对象之间具有不同的值。我想保留两者的值,以便 key1: [9].
这不是下划线答案,但基本上我不会为此使用 reduce 操作,而是做一个简单的 for-each:
var array = [{key: [3]}, {key1: [3]}, {key1: [3]}]
var object = {key1: [3], key2: [3]};
array.forEach(function(current) {
Object.keys(current).forEach(function(name) {
// object[name] = [((object[name] || [])[0] || 0) + current[name][0]];
object[name] = (object[name] || []).concat(current[name]);
});
});
console.log(JSON.stringify(object)); // {"key1":[3,3,3],"key2":[3],"key":[3]}
类似于杰克的答案(也是非下划线),但它创建了一个新对象,它不会修改现有的 object Object:
var array = [{key: [3]}, {key1: [3]}, {key1: [3]}]
var object = {key1: [3], key2: [3]};
var x = array.concat([object]).reduce(function(prev, curr) {
Object.keys(curr).forEach(function(key){
if (prev.hasOwnProperty(key)) {
prev[key][0] += curr[key][0];
} else {
prev[key] = curr[key];
}
});
return prev;
},{});
console.log(JSON.stringify(x)); // {"key":[3],"key1":[9],"key2":[3]}