gpt4 book ai didi

JavaScript 同步两个数组(对象)/查找增量

转载 作者:数据小太阳 更新时间:2023-10-29 05:44:29 24 4
gpt4 key购买 nike

我有两个数组,旧的和新的,它们在每个位置保存对象。我将如何同步或找到增量(即与旧数组相比,新数组中的新内容、更新内容和删除内容)

var o = [
{id:1, title:"title 1", type:"foo"},
{id:2, title:"title 2", type:"foo"},
{id:3, title:"title 3", type:"foo"}
];

var n = [
{id:1, title:"title 1", type:"foo"},
{id:2, title:"title updated", type:"foo"},
{id:4, title:"title 4", type:"foo"}
];

根据上述数据,使用 id 作为键,我们会发现 id=2 的项目有更新的标题,id=3 的项目被删除,id=4 的项目是新的。

是否有现有的库具有有用的功能,或者是循环和内部循环的情况,比较每一行......例如

for(var i=0, l=o.length; i<l; i++)
{
for(var x=0, ln=n.length; x<ln; x++)
{
//compare when o[i].id == n[x].id
}
}

做这种比较三次,找新的,更新的,删除的?

最佳答案

做您需要做的事情没有魔法。您需要遍历这两个对象以查找更改。一个好的建议是将您的结构变成 map 以加快搜索速度。

/**
* Creates a map out of an array be choosing what property to key by
* @param {object[]} array Array that will be converted into a map
* @param {string} prop Name of property to key by
* @return {object} The mapped array. Example:
* mapFromArray([{a:1,b:2}, {a:3,b:4}], 'a')
* returns {1: {a:1,b:2}, 3: {a:3,b:4}}
*/
function mapFromArray(array, prop) {
var map = {};
for (var i=0; i < array.length; i++) {
map[ array[i][prop] ] = array[i];
}
return map;
}

function isEqual(a, b) {
return a.title === b.title && a.type === b.type;
}

/**
* @param {object[]} o old array of objects
* @param {object[]} n new array of objects
* @param {object} An object with changes
*/
function getDelta(o, n, comparator) {
var delta = {
added: [],
deleted: [],
changed: []
};
var mapO = mapFromArray(o, 'id');
var mapN = mapFromArray(n, 'id');
for (var id in mapO) {
if (!mapN.hasOwnProperty(id)) {
delta.deleted.push(mapO[id]);
} else if (!comparator(mapN[id], mapO[id])){
delta.changed.push(mapN[id]);
}
}

for (var id in mapN) {
if (!mapO.hasOwnProperty(id)) {
delta.added.push( mapN[id] )
}
}
return delta;
}

// Call it like
var delta = getDelta(o,n, isEqual);

参见 http://jsfiddle.net/wjdZ6/1/举个例子

关于JavaScript 同步两个数组(对象)/查找增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14966207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com