比较deep中的两个数组对象,并使用javascript在第三个数组中存储不同的值

比较deep中的两个数组对象,并使用javascript在第三个数组中存储不同的值,javascript,Javascript,我有这样的数组 $scope.result1 = [ {id:1, name:'pppp', type:'user', username:'345'}, {id:2, name:'John', type:'admin', username:'johnny2'}, {id:3, name:'Peter', type:'user', username:'pete'}, ]; $scope.result2 = [ {id:1, name:'Seema', type:'

我有这样的数组

$scope.result1 = [
    {id:1, name:'pppp', type:'user', username:'345'},
    {id:2, name:'John', type:'admin', username:'johnny2'},
    {id:3, name:'Peter', type:'user', username:'pete'},
];

$scope.result2 = [
    {id:1, name:'Seema', type:'admin', username:'123'},
    {id:2, name:'John', type:'admin', username:'johnny2'},
    {id:3, name:'Peter123', type:'user', username:'pete'},
];
我想比较result2和result1,并在第三个数组中只存储不同的值。 预期结果是这样的

$scope.result = [
        { name:'Seema', type:'admin', username:'123'},
        {name:'Peter123'},
    ];

提前感谢

如果我认为您需要查找更新的值,您可以按以下方式进行:

var $scope = {};

$scope.result1 = [
    {id:1, name:'pppp', type:'user', username:'345'},
    {id:2, name:'John', type:'admin', username:'johnny2'},
    {id:3, name:'Peter', type:'user', username:'pete'},
];

$scope.result2 = [
    {id:1, name:'Seema', type:'admin', username:'123'},
    {id:2, name:'John', type:'admin', username:'johnny2'},
    {id:3, name:'Peter123', type:'user', username:'pete'},
];

$scope.diffResult = []

for (let i=0; i<$scope.result1.length; i++){
    const o1 = $scope.result1[i];
    const o2 = $scope.result2[i];
    const diff = {};

    Object.getOwnPropertyNames(o1).forEach(p => {
        if (o1[p] !== o2[p]) {
            diff[p] = o2[p];
        }
    })

    if (Object.getOwnPropertyNames(diff).length > 0){
        $scope.diffResult.push(diff);
    }
}

console.log($scope.diffResult);
var$scope={};
$scope.result1=[
{id:1,名称:'pppp',类型:'user',用户名:'345'},
{id:2,名称:'John',类型:'admin',用户名:'johnny2'},
{id:3,名称:'Peter',类型:'user',用户名:'pete'},
];
$scope.result2=[
{id:1,名称:'Seema',类型:'admin',用户名:'123'},
{id:2,名称:'John',类型:'admin',用户名:'johnny2'},
{id:3,名称:'Peter123',类型:'user',用户名:'pete'},
];
$scope.diffResult=[]
for(设i=0;i{
如果(o1[p]!==o2[p]){
差值[p]=o2[p];
}
})
if(Object.getOwnPropertyNames(diff.length>0){
$scope.diffResult.push(差异);
}
}
console.log($scope.diffResult);

另一种可能的方法是使用一个更经过测试的模块,如deep diff(深度差异)

如果我认为您需要查找更新的值,您可以按如下方式执行:

var $scope = {};

$scope.result1 = [
    {id:1, name:'pppp', type:'user', username:'345'},
    {id:2, name:'John', type:'admin', username:'johnny2'},
    {id:3, name:'Peter', type:'user', username:'pete'},
];

$scope.result2 = [
    {id:1, name:'Seema', type:'admin', username:'123'},
    {id:2, name:'John', type:'admin', username:'johnny2'},
    {id:3, name:'Peter123', type:'user', username:'pete'},
];

$scope.diffResult = []

for (let i=0; i<$scope.result1.length; i++){
    const o1 = $scope.result1[i];
    const o2 = $scope.result2[i];
    const diff = {};

    Object.getOwnPropertyNames(o1).forEach(p => {
        if (o1[p] !== o2[p]) {
            diff[p] = o2[p];
        }
    })

    if (Object.getOwnPropertyNames(diff).length > 0){
        $scope.diffResult.push(diff);
    }
}

console.log($scope.diffResult);
var$scope={};
$scope.result1=[
{id:1,名称:'pppp',类型:'user',用户名:'345'},
{id:2,名称:'John',类型:'admin',用户名:'johnny2'},
{id:3,名称:'Peter',类型:'user',用户名:'pete'},
];
$scope.result2=[
{id:1,名称:'Seema',类型:'admin',用户名:'123'},
{id:2,名称:'John',类型:'admin',用户名:'johnny2'},
{id:3,名称:'Peter123',类型:'user',用户名:'pete'},
];
$scope.diffResult=[]
for(设i=0;i{
如果(o1[p]!==o2[p]){
差值[p]=o2[p];
}
})
if(Object.getOwnPropertyNames(diff.length>0){
$scope.diffResult.push(差异);
}
}
console.log($scope.diffResult);

另一种可能的方法是使用一个经过更充分测试的模块,如deep diff

您可以为具有相同
id
的对象创建一个映射,然后检查属性是否有更改,并在新数组中仅返回更改的属性

var$scope={
结果1:[{id:1,名称:'pppp',类型:'user',用户名:'345'},{id:2,名称:'John',类型:'admin',用户名:'johny2'},{id:3,名称:'Peter',类型:'user',用户名:'pete'}],
结果2:[{id:1,名称:'Seema',类型:'admin',用户名:'123'},{id:2,名称:'John',类型:'admin',用户名:'johny2'},{id:3,名称:'Peter123',类型:'user',用户名:'pete'}]
},
map=newmap($scope.result1.map(o=>[o.id,o]));
$scope.result=$scope.result2.reduce((r,o)=>{
var object=map.get(o.id)|{},
temp=Object.entries(o.filter)([k,v])=>Object[k]!==v;
if(温度长度){
r、 push(Object.assign(…temp.map(([k,v])=>({[k]:v}));
}
返回r;
}, []);
log($scope.result)

.as console wrapper{max height:100%!important;top:0;}
您可以为具有相同
id
的对象创建一个映射,然后检查属性是否有更改,并在新数组中仅返回更改的属性

var$scope={
结果1:[{id:1,名称:'pppp',类型:'user',用户名:'345'},{id:2,名称:'John',类型:'admin',用户名:'johny2'},{id:3,名称:'Peter',类型:'user',用户名:'pete'}],
结果2:[{id:1,名称:'Seema',类型:'admin',用户名:'123'},{id:2,名称:'John',类型:'admin',用户名:'johny2'},{id:3,名称:'Peter123',类型:'user',用户名:'pete'}]
},
map=newmap($scope.result1.map(o=>[o.id,o]));
$scope.result=$scope.result2.reduce((r,o)=>{
var object=map.get(o.id)|{},
temp=Object.entries(o.filter)([k,v])=>Object[k]!==v;
if(温度长度){
r、 push(Object.assign(…temp.map(([k,v])=>({[k]:v}));
}
返回r;
}, []);
log($scope.result)

.as console wrapper{max height:100%!important;top:0;}
对于第二个结果中的每个对象,您可以找出哪些值不同,然后使用这些值

const result1=[
{id:1,名称:'pppp',类型:'user',用户名:'345'},
{id:2,名称:'John',类型:'admin',用户名:'johnny2'},
{id:3,名称:'Peter',类型:'user',用户名:'pete'},
];
常量结果2=[
{id:1,名称:'Seema',类型:'admin',用户名:'123'},
{id:2,名称:'John',类型:'admin',用户名:'johnny2'},
{id:3,名称:'Peter123',类型:'user',用户名:'pete'},
];
const getAllKeys=对象=>[
…(新的集合(objects.reduce)((上一个,当前)=>[
…上一页,
…对象.键(当前)
], [])))
];
常量getObjectDifferences=(objectOne,objectTwo)=>
getAllKeys([objectOne,objectTwo])
.map(key=>objectOne[key]!==objectTwo[key]?key:false)
.过滤器(v=>!!v)
.减少((上一个,当前)=>({
…上一页,
[curr]:对象二[curr],
}), {})
常量getDifferences=(listOne,listTwo)=>listTwo
.map(项=>getObjectDifferences(
listOne.filter(x=>x.id==item.id)[0],
项目
)).filter(项=>Object.keys(项).length>0)

dir(getDifferences(result1,result2))
对于第二个结果中的每个对象,您可以找出哪些值不同,然后使用这些值

const result1=[
{id:1,名称:'pppp',类型:'user',用户名:'345'},
{id:2,名称:'John',类型:'admin',用户名:'johnny2'},
{id:3,名称:'Peter',类型:'user',用户名:'pete'},
];
常量结果2=[
{id:1,名称:'Seema',类型:'admin',用户名:'123'},
{id:2,名称:'John',类型:'admin',用户名:'johnny2'},
{id:3,名称:'Peter123',类型:'user',用户名:'pete'},
];
const getAllKeys=对象=>[
…(新的集合(objects.reduce)((上一个,当前)=>[
…上一页,
…对象.键(当前)
], [])))
];
常量getObjectDifferences=(objectOne,objectTwo)=>
getAllKeys([objectOne,objectTwo])
.map(key=>objectOne[key]!==objectTwo[key]?key:false)
.过滤器(v=>!!v)
.减少((上一个,当前)=>({
…上一页,
[货币]: