我有一个如下格式的对象数组。
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"价值。