[英]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.