JavaScript在循环中改变数组

Kok*_*zzu 2 javascript arrays in-place

我想在数组中复制某些数组JavaScript,例如:

var res = [["1,2,3",100,50],["4,5",75,10],["6",20,90]];
var res2 = [];
for(var z in res) {
  var row = res[z];
  var keys = row[0].split(',')
  for(var y in keys) {
    var key = keys[y];
    res2.push([key,row[1]/keys.length,row[2]/keys.length]);
  }
}
/* 
[ [ '1', 33.333333333333336, 16.666666666666668 ],
  [ '2', 33.333333333333336, 16.666666666666668 ],
  [ '3', 33.333333333333336, 16.666666666666668 ],
  [ '4', 37.5, 5 ],
  [ '5', 37.5, 5 ],
  [ '6', 20, 90 ] ]
*/
Run Code Online (Sandbox Code Playgroud)

阵列真的非常长,是否可以就地执行此操作(res没有res2)?

Jun*_*sor 7

您可以使用splice以下的真正就地处理res:

for (var i = 0; i < res.length; ) {
  var row = res[i];
  var keys = row[0].split(',')
  res.splice(i, 1); // Remove old element
  // Insert new elements at current position
  for (var j in keys)
    res.splice(i++, 0, [keys[j], row[1] / keys.length, row[2] / keys.length]);
}
Run Code Online (Sandbox Code Playgroud)

结果:

[
 ["1", 33.333333333333336, 16.666666666666668],
 ["2", 33.333333333333336, 16.666666666666668],
 ["3", 33.333333333333336, 16.666666666666668],
 ["4", 37.5, 5],
 ["5", 37.5, 5],
 ["6", 20, 90]
]
Run Code Online (Sandbox Code Playgroud)

编辑:

避免拼接的另一个技巧是扩展它的大小res并从头到尾开始填充它:

var n = res.length;

// Precalculate new length
var length = 0;
for (var i = 0; i < res.length; i++)
    length += res[i][0].split(',').length;

// Change length of array
res.length = length;

// Start filling from end to start
for (var i = n - 1, k = length - 1; i >= 0; i--) {
    var row = res[i];
    var keys = row[0].split(',');
    for (var j = keys.length - 1; j >= 0; j--)
        res[k--] = [keys[j], row[1] / keys.length, row[2] / keys.length];
}
Run Code Online (Sandbox Code Playgroud)

  • @vp_arth我用无拼接实现更新了 (4认同)