这一次,我遇到以下问题,我从数据库中获取了一个对象数组,该对象数组每隔几分钟更新一次,问题是与以前的数组相比,该数组可以带有新对象或已删除对象。例如;
第一次输入数据
[
{name: 'Paul', color: 'blue', age: '7'},
{name: 'Lisa', color: 'rose', age: '4'}
]
第二次数据输入(添加了一个对象)
[
{name: 'Paul', color: 'blue', age: '7'},
{name: 'Lisa', color: 'rose', age: '4'},
{name: 'Adam', color: 'green', age: '11'}
]
第三次数据输入(删除一个对象)
[
{name: 'Paul', color: 'blue', age: '7'},
{name: 'Adam', color: 'green', age: '11'}
]
与第一个条目相比,我需要检测并验证添加或删除了哪个元素,尝试通过按键进行forEach
操作,但是由于对象的顺序不同,因此无法使用它
如何获得这些差异?
答案 0 :(得分:1)
在尝试并找到最佳解决方案后,我设法做到了以下....
它可以很好地满足我的需求,我在JS中很基本,我希望自己不要犯错,我与可能需要它的人分享。
稍后见。
let before = [
{name: 'Paul', color: 'blue', age: '7'},
{name: 'Lisa', color: 'rose', age: '4'}
]
// second data entry ( an object is added )
let after = [
{name: 'Paul', color: 'blue', age: '7'},
{name: 'Lisa', color: 'rose', age: '4'},
{name: 'Adam', color: 'green', age: '11'}
]
// third data entry ( an object is deleted )
let afterD = [
{name: 'Paul', color: 'blue', age: '7'},
{name: 'Adam', color: 'green', age: '11'}
]
// new element
let newElement = after.filter(element => {
return !before.some(e => element.name === e.name);
});
// delete element
let deleteElement = before.filter(element => {
return !afterD.some(e => element.name === e.name);
});
console.log('new element: ')
console.log(newElement)
console.log('delete element: ')
console.log(deleteElement)
答案 1 :(得分:0)
首先,您需要检查它们的长度,因为如果新数组的长度大于旧数组的长度,则需要在新数组中循环,否则需要在旧数组中循环。这是最重要的一点,您可以找到2个数组的区别。
var oldVal = [
{name: 'Paul', color: 'blue', age: '7'},
{name: 'Lisa', color: 'rose', age: '4'}
];
var newVal = [
{name: 'Paul', color: 'blue', age: '7'},
{name: 'Lisa', color: 'rose', age: '4'},
{name: 'Adam', color: 'green', age: '11'},
{name : 'xxx'}
];
var t1=[];
var t2=[];
if(newVal.length >= oldVal.length){
t1=newVal;
t2=oldVal;
}
else{
t1=oldVal;
t2=newVal;
}
var dif=[];
t1.forEach(i => {
var res = t2.findIndex(x => JSON.stringify(x) == JSON.stringify(i));
console.log(res);
if(res == -1 ){
dif.push(i);
}
})
console.log(dif);
结果将是
0: {name: "Adam", color: "green", age: "11"}
1: {name: "xxx"}