我有两个javascript对象,如下面的
first = {b : ["A" , "B"] , c : ["C" , "D"] , d : ["Z"]}
second = {b : ["E" , "F"] , c : ["X"]}
我想要这样的结果
result = {b : ["A" , "B" , "E" , "F"] , c : ["C" , "D" ,"X"] , d :["Z"]}
我正在玩npm lodash,但找不到办法。一些身体可以帮助。我是Javascript世界的新手。
答案 0 :(得分:3)
您可以使用mergeWith()
并将自定义函数添加到concat数组作为customizer
参数。
var first = {b : ["A" , "B"] , c : ["C" , "D"] , d : ["Z"]}
var second = {b : ["E" , "F"] , c : ["X"]}
var result = _.mergeWith(first, second, function(a, b) {
return [].concat(a, b)
})
console.log(JSON.stringify(result))

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
&#13;
答案 1 :(得分:0)
这会对你有帮助。
var first = {b : ["A" , "B"] , c : ["C" , "D"] , d : ["Z"]};
var second = {b : ["E" , "F"] , c : ["X"]};
var newObj = {};
for(let i in first) {
if(second.hasOwnProperty(i)) {
var tempArray = first[i];
for(let j in second[i]) {
tempArray.push(second[i][j]);
}
newObj[i] = tempArray;
} else {
newObj[i] = first[i];
}
}
console.log(JSON.stringify(newObj));
&#13;
答案 2 :(得分:0)
var first = {b : ["A" , "B"] , c : ["C" , "D"] , d : ["Z"]};
var second = {b : ["E" , "F"] , c : ["X"]};
// merge expects an array of objects to be used as its parameter
var merge = function merge( objs ) {
var result = {};
// for each object sent to this function.
objs.forEach(function( obj ) {
// Grab the array containing all the property keys.
var keys = Object.keys(obj);
// Loop over each keyname
keys.forEach(function( keyName ) {
// first, check if the key exists in our result. If not, create it and assign it an array.
if (!result.hasOwnProperty(keyName)) result[keyName] = [];
// Merge the array inside the object into the result by concatenation.
result[keyName] = result[keyName].concat(obj[keyName]);
});
});
return result;
};
// Use the function
var result = merge([ first, second ]);
console.log(JSON.stringify(result));
// The caveat here is that all the letters in the array are just added, we don't check for duplicates atm
// If duplicates are a thing, just change the .concat into another loop that checks if a letter is already in the array or not.
答案 3 :(得分:0)
lodash mergeWith
docs使用这个确切的东西作为例子:
function customizer(objValue, srcValue) {
// if merging 2 arrays, concat them together
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
}
}
var first = {b : ["A" , "B"] , c : ["C" , "D"] , d : ["Z"]},
second = {b : ["E" , "F"] , c : ["X"]}
console.log(_.mergeWith(first, second, customizer));
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.js"></script>
答案 4 :(得分:0)
由于不需要第三方库(lodash或其他)和一个不错的功能风格,你可以这样做
let first = {b : ["A" , "B"] , c : ["C" , "D"] , d : ["Z"]}
let second = {b : ["E" , "F"] , c : ["X"]}
let sources = [first, second];
let unique = (...sources) => Array.from(new Set([].concat(...sources)));
let join = (...sources) => key => [].concat(...sources.map(source => source[key] || []));
let keys = unique(...sources.map(source => Object.keys(source)));
let merged = keys.reduce((map, key) => (map[key] = join(first, second)(key)) && map, {});
console.log(merged);
这将处理任意数量的字典作为源并将它们合并在一起。