如何在 JavaScript 中连接两个具有数组属性的对象?
How to concatenate two object with array properties in JavaScript?
我有两个对象:
var one = {
addedItems: [0, 1],
removedItems: [8, 9],
oneTwo: false,
someStuff: {
anotherArray: ['a', 'b']
}
};
var two = {
addedItems: [3, 4],
removedItems: [6, 7],
someStuff: {
anotherArray: ['c', 'd']
}
};
最后我需要合并这两个对象并得到类似这样的东西:
{
addedItems: [0, 1, 3, 4],
removedItems: [8, 9, 6, 7],
oneTwo: false,
someStuff: {
anotherArray: ['a', 'b', 'c', 'd']
}
}
操作应该在不同结构的对象上执行。
执行此操作的最佳方法(或可能的方法)是什么? jQuery 或 underscore/lodash 中是否有任何方法允许执行此操作?
您可以生成一个新对象并使用已插入数组中的项目追加数组。
function deepMerge(source, target) {
Object.keys(source).forEach(function (k) {
if (Array.isArray(source[k])) {
if (!Array.isArray(target[k])) {
target[k] = [];
}
target[k] = target[k].concat(source[k]);
return;
}
if (source[k] && typeof source[k] === 'object') {
target[k] = target[k] || {};
deepMerge(source[k], target[k]);
return;
}
target[k] = source[k];
});
}
var one = { addedItems: [0, 1], removedItems: [8, 9], oneTwo: false, someStuff: { anotherArray: ['a', 'b'] } },
two = { addedItems: [3, 4], removedItems: [6, 7], someStuff: { anotherArray: ['c', 'd'] } },
result = {};
deepMerge(one, result);
deepMerge(two, result);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
你检查过 Lodash _.mergeWith(object, sources, customizer)
方法了吗?我认为该示例基本符合您的预期。
https://lodash.com/docs/4.17.15#mergeWith
var one = { addedItems: [0, 1], removedItems: [8, 9], oneTwo: false, someStuff: { anotherArray: ['a', 'b'] } },
two = { addedItems: [3, 4], removedItems: [6, 7], someStuff: { anotherArray: ['c', 'd'] } };
// In case of arrays, concatenate them instead
function customizer(objValue, srcValue) {
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
}
}
var result = _.mergeWith(one, two, customizer);
我有两个对象:
var one = {
addedItems: [0, 1],
removedItems: [8, 9],
oneTwo: false,
someStuff: {
anotherArray: ['a', 'b']
}
};
var two = {
addedItems: [3, 4],
removedItems: [6, 7],
someStuff: {
anotherArray: ['c', 'd']
}
};
最后我需要合并这两个对象并得到类似这样的东西:
{
addedItems: [0, 1, 3, 4],
removedItems: [8, 9, 6, 7],
oneTwo: false,
someStuff: {
anotherArray: ['a', 'b', 'c', 'd']
}
}
操作应该在不同结构的对象上执行。
执行此操作的最佳方法(或可能的方法)是什么? jQuery 或 underscore/lodash 中是否有任何方法允许执行此操作?
您可以生成一个新对象并使用已插入数组中的项目追加数组。
function deepMerge(source, target) {
Object.keys(source).forEach(function (k) {
if (Array.isArray(source[k])) {
if (!Array.isArray(target[k])) {
target[k] = [];
}
target[k] = target[k].concat(source[k]);
return;
}
if (source[k] && typeof source[k] === 'object') {
target[k] = target[k] || {};
deepMerge(source[k], target[k]);
return;
}
target[k] = source[k];
});
}
var one = { addedItems: [0, 1], removedItems: [8, 9], oneTwo: false, someStuff: { anotherArray: ['a', 'b'] } },
two = { addedItems: [3, 4], removedItems: [6, 7], someStuff: { anotherArray: ['c', 'd'] } },
result = {};
deepMerge(one, result);
deepMerge(two, result);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
你检查过 Lodash _.mergeWith(object, sources, customizer)
方法了吗?我认为该示例基本符合您的预期。
https://lodash.com/docs/4.17.15#mergeWith
var one = { addedItems: [0, 1], removedItems: [8, 9], oneTwo: false, someStuff: { anotherArray: ['a', 'b'] } },
two = { addedItems: [3, 4], removedItems: [6, 7], someStuff: { anotherArray: ['c', 'd'] } };
// In case of arrays, concatenate them instead
function customizer(objValue, srcValue) {
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
}
}
var result = _.mergeWith(one, two, customizer);