Javascript 提取对象数组之间的不同道具

Javascript 提取对象数组之间的不同道具,javascript,lodash,Javascript,Lodash,实现以下目标的最有效方式是什么: let oldArray=[{id:“12”,product:“6”,价格:30,售价:33,单位:5}] let newArray=[{id:“12”,product:“6”,price:30,salePrice:33,units:6}] 让结果=extractArrayObjectDifference(oldArray,newArray,'id')/[{id:'12',单位:6}] 及 let oldArray=[{id:“12”,product:“6”,

实现以下目标的最有效方式是什么:

let oldArray=[{id:“12”,product:“6”,价格:30,售价:33,单位:5}]
let newArray=[{id:“12”,product:“6”,price:30,salePrice:33,units:6}]
让结果=extractArrayObjectDifference(oldArray,newArray,'id')/[{id:'12',单位:6}]

let oldArray=[{id:“12”,product:“6”,价格:30,售价:33,单位:5}]
let newArray=[{id:“12”,product:“6”,价格:30,售价:35,单位:6}]
让结果=extractArrayObjectDifference(oldArray,newArray,“id”)/[{id:“12”,售价:35,单位:6}]

let oldArray=[{id:“12”,product:“6”,价格:30,售价:33,单位:5}]
let newArray=[{id:“12”,product:“6”,price:30,salePrice:33,units:6}]
让结果=extractArrayObjectDifference(oldArray,newArray,“product”)/[{product:“6”,单位:6}]

let oldArray=[{id:“12”,product:“6”,价格:30,售价:33,单位:5}]
let newArray=[{id:“12”,product:“6”,价格:30,售价:33,单位:5}]
让结果=extractArrayObjectDifference(oldArray,newArray,“id”)/[]
extractArrayObjectDifference
函数应该创建一个数组,其中的对象包含“id”或作为第三个参数提供的任何其他属性,以及从原始数组中的对象修改的每个属性

我试过以下方法,但似乎无法奏效。我用了lodash

import isEmpty from 'lodash/isEmpty'
import isEqual from 'lodash/isEqual'
import isObject from 'lodash/isObject'
function difference(object, base) {
    return transform(object, (result: any, value, key) => {
        if (!isEqual(value, base[key])) {
            result[key] = (isObject(value) && isObject(base[key])) ? difference(value, base[key]) : value;
        }
    });
}

function extractArrayObjectDifference(oldVal, newVal, key) {
    let out = [];
    for (let i = 0; i <= newVal.length; i++) {
        let result = difference(newVal[i], oldVal[i])
        if (!isEmpty(result)) {
            result[key] = newVal[key]
            out.push(result)
        }
    }
    return out
}
从“lodash/isEmpty”导入isEmpty
从“lodash/isEqual”导入isEqual
从“lodash/isObject”导入isObject
功能差异(对象、基础){
返回变换(对象,(结果:任意、值、键)=>{
如果(!isEqual(值,基[key])){
结果[键]=(等分对象(值)和等分对象(基[键])?差异(值,基[键]):值;
}
});
}
函数提取ArrayObject差异(oldVal、newVal、key){
放出=[];
对于(让i=0;i使用
Object.entries()
循环旧对象和新对象的属性。然后使用
.filter()
仅选择要保留的属性,即两个对象之间不同的属性,以及
id
属性。最后,将其作为新对象放回gether

在数组上循环时,您可以过滤结果以删除只有一个属性的对象。这将始终是
id
属性,因此这意味着所有其他属性都是相同的,您不希望在结果中使用此属性

功能差异(oldObj、newObj、keyToKeep){
返回Object.fromEntries(
Object.entries(newObj.filter)([key,val])=>
key==keyToKeep | | val!=oldObj[key]
)
);
}
函数extractArrayObjectDifference(旧数组、新数组、键){
返回oldArray.map((el,i)=>差(el,newArray[i],key))
.filter(obj=>Object.keys(obj.length>1);
}
让oldArray=[{id:“12”,product:“6”,价格:30,售价:33,单位:5}]
let newArray=[{id:“12”,product:“6”,price:30,salePrice:33,units:6}]
log(extractArrayObjectDifference(oldArray,newArray,'id'))/[{id:“12”,单位:6}]
newArray=[{id:“12”,产品:“6”,价格:30,售价:35,单位:6}]
log(extractArrayObjectDifference(oldArray,newArray,“id”))/[{id:“12”,售价:35,单位:6}]
newArray=[{id:“12”,产品:“6”,价格:30,售价:33,单位:6}]
log(extractArrayObjectDifference(oldArray,newArray,“product”))//[{product:“6”,单位:6}]
newArray=[{id:“12”,产品:“6”,价格:30,售价:33,单位:5}]

console.log(extractArrayObjectDifference(oldArray,newArray,“id”))/[]
对象开始。条目(newArray[i])。过滤器(…)
过滤器函数应返回
id
属性以及与
oldArray[i]具有不同值的任何属性
。很抱歉,我没有发布我的解决方案,因为我没有成功。我没有使用堆栈溢出作为免费编码服务。这不是
的区别()
应该有3个参数?两个数组中对应的元素是否总是在同一个索引中?是的,它们将在同一个索引中。为了简单起见,我重命名了函数。我更新了问题以反映这一点。