Javascript 当数组包含更新数据时合并数组
Javascript merge arrays when one contains updated data
我有两个这样的对象数组:
var myArray = [
{pk: '1', person: 'person 1'},
{pk: '2', person: 'someone'},
];
var updatedArray = [
{pk: '2', person: 'another person'}
];
我希望以最有效的方式合并两者。
我的想法是将较旧的 myArray 合并到较新的 updatedArray 中,并删除 myArray.pk == updatedArray.pk
中的任何项目
我在尝试使用 jQuery 或下划线时遇到问题。
我也一直在尝试使用 this one 作为示例。
有什么想法吗?
我认为遍历更新并将其复制到当前值是一个好方法。
如果您只有一个 属性 需要更改,那么就不需要 Object.assign
。您可以简单地将其替换为
myArray[idx].name = uv.name
var myArray = [
{pk: '1', person: 'person 1'},
{pk: '2', person: 'someone'},
];
var updatedArray = [
{pk: '2', person: 'another person'}
];
updatedArray.forEach(uv => {
var idx = myArray.findIndex(v => v.pk === uv.pk)
if (idx != -1)
myArray[idx] = Object.assign({}, myArray[idx], uv);
else myArray.push(uv);
});
console.log(myArray)
最有效的方法是,首先从其中一个数组创建一个映射。
然后 运行 一个循环并从地图中获取项目
你只需要两个函数,reduce
和 map
这种方式只需要array1.length + array2.length
次迭代,不需要array1.length * array2.length
// creates the map
var myMap = myArray.reduce(function(obj, item) {
obj[item.pk] = item
}, {})
// merges updatedArray items, with the item from the map
var mergedArray = updatedArray.map(function(item) {
return myMap[item.pk] ? Object.assign({}, myMap[item.pk], item) : item
})
你可以试试
function mergeArr(arrOne, arrTwo, prop) {
_.each(arrTwo, function(arrTwoobj) {
var arrOneobj = _.find(arrOne, function(arrOneobj) {
return arrOneobj[prop] === arrTwoobj[prop];
});
arrOneobj ? _.extend(arrOneobj, arrTwoobj) : arrOne.push(arrTwoobj);
});
}
var myArray = [
{pk: '1', person: 'person 1'},
{pk: '2', person: 'someone'},
];
var updatedArray = [
{pk: '2', person: 'another person'}
];
mergeArr(myArray, updatedArray, 'pk');
console.log(myArray);
var myArray = [
{pk: '1', person: 'person 1'},
{pk: '2', person: 'someone'},
];
var updatedArray = [
{pk: '2', person: 'another person'}
];
var exists = [];
for (item of updatedArray) {
exists[item.pk] = true;
}
for (item of myArray) {
if (!exists.hasOwnProperty(item.pk)) {
updatedArray.push(item);
}
}
console.log(updatedArray);
我有两个这样的对象数组:
var myArray = [
{pk: '1', person: 'person 1'},
{pk: '2', person: 'someone'},
];
var updatedArray = [
{pk: '2', person: 'another person'}
];
我希望以最有效的方式合并两者。 我的想法是将较旧的 myArray 合并到较新的 updatedArray 中,并删除 myArray.pk == updatedArray.pk
中的任何项目我在尝试使用 jQuery 或下划线时遇到问题。 我也一直在尝试使用 this one 作为示例。
有什么想法吗?
我认为遍历更新并将其复制到当前值是一个好方法。
如果您只有一个 属性 需要更改,那么就不需要 Object.assign
。您可以简单地将其替换为
myArray[idx].name = uv.name
var myArray = [
{pk: '1', person: 'person 1'},
{pk: '2', person: 'someone'},
];
var updatedArray = [
{pk: '2', person: 'another person'}
];
updatedArray.forEach(uv => {
var idx = myArray.findIndex(v => v.pk === uv.pk)
if (idx != -1)
myArray[idx] = Object.assign({}, myArray[idx], uv);
else myArray.push(uv);
});
console.log(myArray)
最有效的方法是,首先从其中一个数组创建一个映射。 然后 运行 一个循环并从地图中获取项目
你只需要两个函数,reduce
和 map
这种方式只需要array1.length + array2.length
次迭代,不需要array1.length * array2.length
// creates the map
var myMap = myArray.reduce(function(obj, item) {
obj[item.pk] = item
}, {})
// merges updatedArray items, with the item from the map
var mergedArray = updatedArray.map(function(item) {
return myMap[item.pk] ? Object.assign({}, myMap[item.pk], item) : item
})
你可以试试
function mergeArr(arrOne, arrTwo, prop) {
_.each(arrTwo, function(arrTwoobj) {
var arrOneobj = _.find(arrOne, function(arrOneobj) {
return arrOneobj[prop] === arrTwoobj[prop];
});
arrOneobj ? _.extend(arrOneobj, arrTwoobj) : arrOne.push(arrTwoobj);
});
}
var myArray = [
{pk: '1', person: 'person 1'},
{pk: '2', person: 'someone'},
];
var updatedArray = [
{pk: '2', person: 'another person'}
];
mergeArr(myArray, updatedArray, 'pk');
console.log(myArray);
var myArray = [
{pk: '1', person: 'person 1'},
{pk: '2', person: 'someone'},
];
var updatedArray = [
{pk: '2', person: 'another person'}
];
var exists = [];
for (item of updatedArray) {
exists[item.pk] = true;
}
for (item of myArray) {
if (!exists.hasOwnProperty(item.pk)) {
updatedArray.push(item);
}
}
console.log(updatedArray);