我想基于索引列表在嵌套对象结构中设置一个布尔值
我要更新的数据如下:
let categories = [{
"name": "Cat 1",
"subs": [{
"name": "Sub Cat 1.1",
"subs": [],
"checked": false
},
{
"name": "Sub Cat 1.2",
"subs": [],
"checked": false
}
],
"checked": false
},
{
"name": "Cat 2",
"subs": [],
"checked": false
}
];
索引存储在数组中:
let categoryIndexs = [0,1]
因此基于categoryIndexs
,我想将checked
“ Sub Cat 1.2”的对象的name
属性更改为true
。
这就像将数组[0,1]
转换为categories[0].subs[1]
并更新其checked
属性一样。
到目前为止,我设法获得了值并分别进行编辑,但是如何直接更改categories
变量?
let categoryIndexs = [0,1]
let tmp_array = categories;
for(var i = 0; i < categoryIndexs.length;i++){
if(i == 0){
tmp_array = tmp_array[categoryIndexs[i]]
} else {
tmp_array = tmp_array.subs[categoryIndexs[i]]
}
}
tmp_array.checked = true
console.log(tmp_array)
解决方案必须是动态的,因此,如果“ Sub Cat 1.2”在其自己的subs
数组中具有嵌套条目,则可以像categoryIndexs
一样使用[0,1,0]
访问它< / p>
答案 0 :(得分:2)
您可以在一个循环中迭代给定的索引,同时像下面的函数一样深入数据结构:
function setChecked(categories, categoryIndexes) {
let obj = null;
for (let index of categoryIndexes) {
obj = categories[index];
categories = obj.subs;
}
obj.checked = true;
}
let categories = [{"name": "Cat 1","subs": [{"name": "Sub Cat 1.1","subs": [],"checked": false},{"name": "Sub Cat 1.2","subs": [],"checked": false}],"checked": false},{"name": "Cat 2","subs": [],"checked": false}];
setChecked(categories, [0,1]);
console.log(categories);
答案 1 :(得分:2)
您可以使用reduce
来获取最后一个subs
,直到最后一个subs
并更新checked
属性
let categories = [{"name": "Cat 1","subs": [{"name": "Sub Cat 1.1","subs": [],"checked": false},{"name": "Sub Cat 1.2","subs": [],"checked": false}],"checked": false},{"name": "Cat 2","subs": [],"checked": false}];
let categoryIndexs = [0, 1];
function update(categories, indices) {
const last = indices.pop(); // remove the last
const redued = indices.reduce((acc, i) => acc[i].subs, categories);
redued[last].checked = true;
return categories
}
console.log(update(categories, categoryIndexs))
答案 2 :(得分:2)
您可以通过查看迭代的索引来缩小数组,并获取subs
或项。
const
getValue = (subs, indices) => indices.reduce(
({ subs }, i) => subs[i],
{ subs }
);
let categories = [{ name: "Cat 1", subs: [{ name: "Sub Cat 1.1", subs: [], checked: false }, { name: "Sub Cat 1.2", subs: [], checked: false }], checked: false }, { name: "Cat 2", subs: [], checked: false }],
indices = [0, 1];
console.log(getValue(categories, indices, 'subs'));