替换数组元素而不会丢失引用?

时间:2017-06-20 17:58:35

标签: javascript

如何在不丢失引用的情况下替换数组的所有元素?

var arr = [1, 2, 3];
var b = arr;
b == arr; // true
magic(arr, [4, 5, 6]);
b == arr; // should return true

这样做的一种方法是弹出和推动。有干净的方式吗?

5 个答案:

答案 0 :(得分:3)

您可以拼接旧值并附加新值。



function magic(reference, array) {
    [].splice.apply(reference, [0, reference.length].concat(array));
}

var arr = [1, 2, 3],
    b = arr;

console.log(b === arr); // true
magic(arr, [4, 5, 6]);
console.log(b === arr); // should return true

console.log(arr);




另一种方法是使用Object.assign。这需要设置数组的长度,如果它小于原始数组。



function magic(reference, array) {
    Object.assign(reference, array, { length: array.length });
}

var arr = [1, 2, 3],
    b = arr;

console.log(b === arr); // true
magic(arr, [4, 5, 6, 7]);
console.log(b === arr); // should return true

console.log(arr);




答案 1 :(得分:1)

神奇的部分可能是:

arr.splice(0, arr.length, 4, 5, 6);

var arr = [1, 2, 3];
var b = arr;
b == arr; // true
arr.splice(0, arr.length, 4, 5, 6);
console.log(b);
console.log(arr);
console.log(arr === b);
.as-console-wrapper { max-height: 100% !important; top: 0; }

如果您已在变量中使用替换数组(假设为repl = [4, 5, 6]),则使用rest parameters语法:

arr.splice(0, arr.length, ...repl);

var arr = [1, 2, 3];
var b = arr;
var repl = [4, 5, 6];
b == arr; // true

arr.splice(0, arr.length, ...repl);
console.log(b);
console.log(arr);
console.log(arr === b);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

这是一种方式:

var arr = [1, 2, 3];
var b = arr;
console.log(`b == arr, b
`, b == arr, b.join());
var c = magic(arr, [4, 5, 6]);
console.log(`b == arr, b
`, b == arr, b.join());
console.log(`c == arr, c
`, c == arr, c.join());

function magic(to, from) {
  // remove elements from existing array
  var old = to.splice(0);
  
  for (var i = 0; i < from.length; i++) {
    to[i] = from[i];
  }
  
  return old;
}

此实现返回最初在数组中的旧元素的副本。

答案 3 :(得分:0)

将新值复制到旧值上。

function magic(arr, newvals) {
  for (let i = 0; i < newvals.length; i++) arr[i] = newvals[i];
  arr.length = newvals.length;
}

答案 4 :(得分:0)

function replaceArrValues(arrRef, newValues)
{
  arrRef.length = 0; // clear the array without losing reference
  newValues.forEach(x => arrRef.push(x));
}