Javascript - 创建数值数组索引的动态索引

时间:2018-04-23 10:34:25

标签: javascript arrays multidimensional-array

我有一个像这样的数组

var a= [[1, 2, [6, 7, 8]], 4, 5];

和另一个通过描述索引来指示特定元素的数组:

var index= [0, 2, 2 ]; // = 8 in a

我需要的是使用变量“index”来创建“a”的索引,并用另一个值替换对应的元素(8),例如“hello”。

我该怎么办?

4 个答案:

答案 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; }