我有一个索引'3_1_0'和以下数组:-
var fields = [
{
name: 'a'
},
{
name: 'b'
},
{
name: 'c'
},
{
name: 'd',
fields: [
{
name: 'd1'
},
{
name: 'd2',
fields: [
{
name: 'd2.1'
}
]
}
]
}
]
我需要根据索引从上面的字段数组中提取元素。因此3_1_0将提取以下内容
{
name: 'd2.1'
}
将d2.1的值更新为其他值,如'new_d2.1',并将更新后的值附加到原始字段数组的相同索引处,并返回更新后的字段数组。如何做到这一点?
可以使用Array。减少以得到期望的结果。我们首先将索引拆分为一个数组,然后进行缩减以获得结果。
我们将使用一些可选链接来确保如果没有找到值(假设我们的索引是'7_10_20'),我们将返回undefined
。
找到对象后,可以设置所需的属性。
const fields = [ { name: 'a' }, { name: 'b' }, { name: 'c' }, { name: 'd', fields: [ { name: 'd1' }, { name: 'd2', fields: [ { name: 'd2.1' } ] } ] } ];
const index = '3_1_0'
function setValue(fields, index, property, value) {
const obj = index.split('_').reduce((acc, key) => {
return acc?.[key] || acc?.fields?.[key];
}, fields);
// Only update if we actually find anything
if (obj) {
obj[property] = value
}
}
setValue(fields, '3_1_0', 'name', 'new_d2.1');
console.log("Fields:", fields);
const data = [{ name: 'a' }, { name: 'b' }, { name: 'c' }, { name: 'd', fields: [ { name: 'd1' }, { name: 'd2', fields: [ { name: 'd2.1' } ] } ] } ];
let givenIdxs = "3_1_0";
let indexes = givenIdxs.split("_");
let result = data[indexes[0]];
for(let idx = 1; idx < indexes.length; idx++){
result = result.fields[indexes[idx]];
}
console.log(result);