我有資料陣列,里面有嵌套陣列(level1arr,leve21arr ...)
const data = [
{
level1arr: [
{
level2arr: [{ id: 1, isValid: true }, { id: 2, isValid: true }, { id: 3, isValid: true }],
},
{
level2arr: [{ id: 4, isValid: true }, { id: 5, isValid: true }, { id: 6, isValid: true }],
},
],
},
{
level1arr: [
{
level2arr: [{ id: 7, isValid: true }, { id: 8, isValid: true }, { id: 9, isValid: true }],
},
{
level2arr: [{ id: 10, isValid: true }, { id: 11, isValid: true }, { id: 12, isValid: true }],
},
],
},
];
我還有另一個陣列:
const invalidIds = [2,5]
我想找到具有 apecyfic id 的元素并將 isValid 屬性更改為 false。在多個嵌套陣列上是否比 iteratinf 更好的方法,例如:
data.forEach(lvl1 => {
lvl1.level1arr.forEach(lvl2 => {
lvl2.level2arr.forEach(element => {
// further nesting
});
});
})
這種對多個陣列的迭代對性能不利。使用嵌套陣列處理這種情況的最佳方法是什么?
uj5u.com熱心網友回復:
如果是嵌套陣列,則可以使用Array.prototype.flat()。但是,您混合使用了嵌套物件和陣列。您必須為此資料結構撰寫自定義的“flattener”。查看此答案以獲取詳細資訊:如何將此嵌套物件轉換為平面物件?
uj5u.com熱心網友回復:
您可以使用遞回,直到達到所需的級別。這是一種方法。
const data = [{
level1arr: [{
level2arr: [{
id: 1,
isValid: true
}, {
id: 2,
isValid: true
}, {
id: 3,
isValid: true
}],
},
{
level2arr: [{
id: 4,
isValid: true
}, {
id: 5,
isValid: true
}, {
id: 6,
isValid: true
}],
},
],
},
{
level1arr: [{
level2arr: [{
id: 7,
isValid: true
}, {
id: 8,
isValid: true
}, {
id: 9,
isValid: true
}],
},
{
level2arr: [{
id: 10,
isValid: true
}, {
id: 11,
isValid: true
}, {
id: 12,
isValid: true
}],
},
],
},
];
const invalidIds =[2,5]
const findId = (object, key, value) => {
if (Array.isArray(object)) {
for (const obj of object) {
findId(obj, key, value);
}
} else {
if (object.hasOwnProperty(key) && object[key] === value) {
object.isValid = false;
return object
}
for (const k of Object.keys(object)) {
if (typeof object[k] === "object") {
findId(object[k], key, value);
}
}
}
}
invalidIds.forEach(id => findId(data, "id", id))
console.log(data)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/315973.html
標籤:javascript 数组
