簡體   English   中英

替換數組元素而不會丟失引用?

[英]Replace array elements without losing reference?

如何在不丟失引用的情況下替換數組的所有元素?

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

一種方法是通過彈出和推動。 有干凈的方式嗎?

您可以拼接舊值並附加新值。

 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); 

神奇的部分可能是:

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] ),那么使用其余的參數語法:

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

這是一種方式:

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

此實現返回最初在數組中的舊元素的副本。

將舊值復制到舊值上。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM