Javascript通过对象数组循环,并返回一个仅包含其值已更改的键的对象

Javascript通过对象数组循环,并返回一个仅包含其值已更改的键的对象,javascript,arrays,object,filter,key,Javascript,Arrays,Object,Filter,Key,我有一个对象数组,需要循环检查对象的键是否有不同的值。如果是,请返回此密钥 const arrayOfObjects = [ { item: { first_name: "Joe", last_name: "Dow", age: 15 } }, { item: { first_name: "Joe", last_name: "d", age: 15 } }, { item: { first_name: "Joe", last_name: "Dow", age: 20 } } ];

我有一个对象数组,需要循环检查对象的键是否有不同的值。如果是,请返回此密钥

const arrayOfObjects = [
  { item: { first_name: "Joe", last_name: "Dow", age: 15 } },
  { item: { first_name: "Joe", last_name: "d", age: 15 } },
  { item: { first_name: "Joe", last_name: "Dow", age: 20 } }
];
预期结果应为:

const result = {
  last_name: true,
  age: true
}

PS:每个对象的键数始终相同

您可以在
阵列对象中循环。检查当前
的键是否与前一个对象的
具有不同的值。如果是,请在
result
中将该键设置为
true

const arrayOfObjects=[{item:{first_name:“Joe”,last_name:“Dow”,age:15}},{item:{first_name:“Joe”,last_name:“d”,age:15},{item:{first_name:“Joe”,last_name:“Dow”,age:20}];
const result={};
arrayOfObjects.forEach(({item},i,arr)=>{
如果(i==0)返回;//跳过第一项
const prev=arr[i-1].item;//获取上一项
用于(常量输入项){
如果(项[键]!==上一个[键])
结果[键]=真
}
})

console.log(result)
您可以通过
数组对象进行循环。检查当前
的键是否与前一个对象的
具有不同的值。如果是,请在
result
中将该键设置为
true

const arrayOfObjects=[{item:{first_name:“Joe”,last_name:“Dow”,age:15}},{item:{first_name:“Joe”,last_name:“d”,age:15},{item:{first_name:“Joe”,last_name:“Dow”,age:20}];
const result={};
arrayOfObjects.forEach(({item},i,arr)=>{
如果(i==0)返回;//跳过第一项
const prev=arr[i-1].item;//获取上一项
用于(常量输入项){
如果(项[键]!==上一个[键])
结果[键]=真
}
})

console.log(result)
您可以对嵌套对象进行检查

功能检查(源、目标、结果){
Object.entries(source.forEach([k,v])=>{
if(v&&typeof v==='object')返回检查(v,目标[k],结果);
如果(结果[k]==未定义)结果[k]=真;
结果[k]=结果[k]&v==目标[k];
});
返回结果;
}
var arrayOfObjects=[{item:{first_name:“Joe”,last_name:“Dow”,age:15}},{item:{first_name:“Joe”,last_name:“Joe”,last_name:“Dow”,age:20}],
result=arrayOfObjects.reduce((r,o,q])=>check(q,o,r),{});

控制台日志(结果)您可以进行检查,查看嵌套对象

功能检查(源、目标、结果){
Object.entries(source.forEach([k,v])=>{
if(v&&typeof v==='object')返回检查(v,目标[k],结果);
如果(结果[k]==未定义)结果[k]=真;
结果[k]=结果[k]&v==目标[k];
});
返回结果;
}
var arrayOfObjects=[{item:{first_name:“Joe”,last_name:“Dow”,age:15}},{item:{first_name:“Joe”,last_name:“Joe”,last_name:“Dow”,age:20}],
result=arrayOfObjects.reduce((r,o,q])=>check(q,o,r),{});

控制台日志(结果)您还可以使用和在键上分组并不断添加值的位置来解决此问题。然后根据集合的大小进行筛选。。。如果大于1,则有多个值:

const data=[{item:{first_name:“Joe”,last_name:“Dow”,age:15}},{item:{first_name:“Joe”,last_name:“Joe”,last_name:“Dow”,age:20}];
让result=data.reduce((r,{item},i,a)=>{
Object.keys(item).forEach(k=>r[k]=(r[k]| | new Set()).add(item[k]))
返回i==(a.length-1)
?Object.keys(r).filter(k=>r[k].size>1).reduce((r,k)=>(r[k]=true,r),{})
:r
}, {})

console.log(result)
您还可以通过在键上分组并不断添加值的位置来解决此问题。然后根据集合的大小进行筛选。。。如果大于1,则有多个值:

const data=[{item:{first_name:“Joe”,last_name:“Dow”,age:15}},{item:{first_name:“Joe”,last_name:“Joe”,last_name:“Dow”,age:20}];
让result=data.reduce((r,{item},i,a)=>{
Object.keys(item).forEach(k=>r[k]=(r[k]| | new Set()).add(item[k]))
返回i==(a.length-1)
?Object.keys(r).filter(k=>r[k].size>1).reduce((r,k)=>(r[k]=true,r),{})
:r
}, {})

console.log(结果)
只需使用
find
。更清楚

const数据=[
{项目:{名字:“乔”,姓氏:“陶氏”,年龄:15}},
{项目:{名:“乔”,姓:“d”,年龄:15},
{项目:{名字:“乔”,姓氏:“陶氏”,年龄:20}}
];
让结果={};
对于(数据[0]中的变量项)。项){
if(data.find((el)=>el.item[key]!==数据[0]。item[key])){
结果[键]=真;
}
}

控制台日志(结果)只需使用
查找
。更清楚

const数据=[
{项目:{名字:“乔”,姓氏:“陶氏”,年龄:15}},
{项目:{名:“乔”,姓:“d”,年龄:15},
{项目:{名字:“乔”,姓氏:“陶氏”,年龄:20}}
];
让结果={};
对于(数据[0]中的变量项)。项){
if(data.find((el)=>el.item[key]!==数据[0]。item[key])){
结果[键]=真;
}
}

控制台日志(结果)“有不同的值”比什么?抱歉我的解释能力差,在第二个对象中last_名称已更改,因此需要标记并返回,如果键更改,则需要返回,不管多少次获取数组第一项的值,执行foreach和if以与所有其他项的值进行比较,如果其中一个不匹配,则将结果设置为true/false并断开foreach。因此,您正在查找数组中“last_name”属性的值与数组中第一个项目的值不同的任何项目?因此,您只希望查看
下的键值