我有一个像这样的数组
var a= [[1, 2, [6, 7, 8]], 4, 5];
和另一个通过描述索引来指示特定元素的数组:
var index= [0, 2, 2 ]; // = 8 in a
我需要的是使用变量“index”来创建“a”的索引,并用另一个值替换对应的元素(8),例如“hello”。
我该怎么办?
答案 0 :(得分:0)
使用Array.reduce()
迭代index
数组而不使用最后一个元素(使用Array.slice()
),并获取子数组。 Splice子数组中最后一个索引的文本:
const index = [0, 2, 2 ]; // = 8 in a
const a = [[1, 2, [6, 7, 8]], 4, 5];
const updateIndex = (arr, index, replacement) => {
index
.slice(0, -1)
.reduce((c, i) => c[i], arr)
.splice(index[index.length -1], 1, replacement);
}
updateIndex(a, index, 'hello');
console.log(a);

答案 1 :(得分:0)
索引数组的每个索引基本上表示嵌套级别,索引处的值表示目标元素所在的数组的索引或目标元素本身的索引(如果它是数组索引的最后一个元素)。问题可以很容易地递归解决
为简单起见,我正在调用索引数组,路径
var path = [0, 2, 2]
var values = [[1, 2, [6, 7, 8]], 4, 5];
function findValues(path, values) {
//base case, if length = 1 we have the index of target element
if(path.length == 1) {
var targetIndex = path[0]
//read it
console.log(values[path]) //8
// modify it
values[path] = 'hello'
} else {
// pick the current nesting level
var currentLevel = path.shift()
// go one level down
findValues(path, values[currentLevel])
}
}
findValues(path, values)
console.log(values) // [[1, 2, [6, 7, "hello"]], 4, 5]
该函数假定路径和值数组处于有效状态,即目标元素存在于给定路径上,您可能希望修改此函数以验证输入并处理边缘情况
答案 2 :(得分:0)
您可以创建一个访问所需数组并更改值的函数。
看看:
var index = [0, 2, 2 ]; // = 8 in a
var a = [[1, 2, [6, 7, 8]], 4, 5];
function updateIndex(arr, index, value) {
var elementIndex = index.pop();
var tempArray = a;
index.forEach(item => tempArray = tempArray[item]);
tempArray[elementIndex] = value;
}
updateIndex(a, index, 'hello');
console.log(a);
答案 3 :(得分:0)
您可以使用一个使用indices
vopy的函数并保存last
索引以访问简化数组以分配value
。
此提案也会创建缺少的数组。
function setValue(array, [...indices], value) {
var last = indices.pop();
indices.reduce((a, i) => a[i] = a[i] || [], array)[last] = value;
}
var array = [[1, 2, [6, 7, 8]], 4, 5];
setValue(array, [0, 2, 2 ], 'hello'); // targetting 8
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }