Javascript +比较两个对象数组并从其中一个对象赋值



我有一个如下格式的对象数组。

let selectedCols = 
[
{
"table" :
{ 
"id" : "bafc1af7-e2c5-ec11-a7b6-00224818a168",
"name" : "test1"
}
visible : true
trueCol : 1
},
{
"table" :
{ 
"id" : "cdep1af7-e4c5-ec11-a7b6-00224818a198",
"name" : "test2"
}
visible : true
trueCol : 2
}
]

我正在我的代码中创建上述对象的副本,并在复制的对象

中修改其可见属性
let copyOfSelectedColsObj = JSON.parse(JSON.stringify(selectedCols ));
copyOfSelectedColsObj.forEach(column => column.visible = false);

现在我只想复制'可见'属性的值从copyOfSelectedColsObj回到我的原始对象无论id字段匹配。我怎样才能做到这一点?

我很新的javascript和不能弄清楚这一点。如有任何帮助,不胜感激

您可以再次使用forEach来迭代原始数组(selectedCols),当它找到与目标数组(copyOfSelectedColsObj)中当前元素具有相同id的元素时,替换可见属性。

let selectedCols = [{table:{id:"bafc1af7-e2c5-ec11-a7b6-00224818a168",name:"test1"},visible:true,trueCol:1},{table:{id:"cdep1af7-e4c5-ec11-a7b6-00224818a198",name:"test2"},visible:true,trueCol:2}];
let copyOfSelectedColsObj = JSON.parse(JSON.stringify(selectedCols));
const overwrite = () => {
selectedCols.forEach(column => {  
// Get the current element id
const tableId = column?.table?.id;
// If the current element id does not exist, no processing is required
if (tableId) {
// Find element matching element id from target array
const filtered = selectedCols.filter(c => c?.table?.id == tableId);
// When the element is found, replace the visible property
if (filtered.length > 0) {
column['visible'] = filtered[0]['visible'];
}
}
return column;
});
}
// Replace all visible with false
copyOfSelectedColsObj.forEach(column => column.visible = false);
overwrite();
console.log('Replace all visible with false', copyOfSelectedColsObj);
// Replace one of the visible with true
copyOfSelectedColsObj[0]['visible'] = true;
overwrite();
console.log('Replace one of the visible with true', copyOfSelectedColsObj);

selectedCols.forEach((column,i) => {
if(column.table.id===copyOfSelectedColsObj[i].table.id) {
column.visible = copyOfSelectedColsObj[i].visible;       
}
})

你说无论id字段匹配,因为复制对象是原始对象的副本,难道你不认为每个id都会匹配,因此你可以将所有可见属性设置为false。

我建议一个数组在另一个循环中循环,但只适用于小数组。

像这样:

let newSelectedCols = selectedCols.map((i) => {
return {
...i,
visible: copyOfSelectedColsObj.find(
(j) => j.table.id === i.table.id
)?.visible,
};
});

映射将遍历原始表,并为每个元素查找具有相同表的项。Id和(如果存在),它将复制"visible"价值。

最新更新