簡體   English   中英

在數組原型中使用array.splice

[英]Using array.splice inside Array prototype

Array.prototype.move = function(oldIndex, newIndex) {
    var val = this.splice(oldIndex, 1);
    this.splice(newIndex, 0, val[0]);
}

//Testing - Change array position
var testarray = [1, 2, 3, 4];
testarray.move(3, 0);
console.log(testarray);

這將產生錯誤“ this.splice不是函數”,但會返回所需的結果。 為什么?

Array.prototype.move = function(oldIndex, newIndex) {
    if(Object.prototype.toString.call(this) === '[object Array]') {
        if(oldIndex && typeof oldIndex == 'number' && newIndex && typeof newIndex == 'number') {
            if(newIndex > this.length) newIndex = this.length;
            this.splice(newIndex, 0, this.splice(oldIndex, 1)[0]);
        }
    }
};

由於某種原因,該函數正在被加載的文檔所調用(尚未完全弄清楚)。 我添加了一些檢查以驗證此=數組,然后如果提供的int大於總長度,則還將新索引重置為等於總大小。 這解決了我遇到的錯誤問題,對我來說,這是在數組中移動對象的最簡單方法。 至於為什么要調用該函數,onload必須與我的代碼有關。

您不需要占位符變量-

Array.prototype.move = function(oldIndex, newIndex) {
       this.splice(newIndex, 0, this.splice(oldIndex, 1)[0]);
}
var a=[1,2,3,4,9,5,6,7,8];
a.move(4,8);

a[8]
/*  returned value: (Number)
9
*/

如果您的代碼必須在任意環境中運行,則向內置對象添加屬性並不是一個好主意。 如果您確實擴展了此類對象,則不應使用可能被其他人執行相同或相似操作的屬性名稱。

似乎有多種“移動”成員的方法,您似乎正在做的事情可以更好地命名為“交換”,因此:

if (!Array.prototype.swap) {
  Array.prototype.swap = function(a, b) {
    var t = this[a];
    this[a] = this[b];
    this[b] = t; 
  }
}

我希望簡單的值重新分配比調用需要創建新數組並多次修改舊數組的方法更有效。 但是無論如何這可能是沒有意義的。 上面的內容顯然更易於閱讀,而且鍵入的字符更少。

還要注意,以上內容是穩定的, array.swap(4,8)的結果與array.swap(8,4)

如果要使函數健壯,則首先需要弄清楚索引大於array.length或不存在索引的情況下的處理方法,依此類推。 例如

var a = [,,2]; // a has length 3
a.swap(0,2);

在上面,在0或1處沒有成員,僅在2處。所以結果應該是:

a = [2]; // a has length 1

還是應該這樣(將是上述結果):

a = [2,,undefined]; // a has length 3

要么

a = [2,,,]; // a has length 3 (IE may think it's 4, but that's wrong)

編輯

請注意,在OP中,以下結果:

var b = [,,2];
b.move(0,2);

alert(b); // [,2,];

這可能不是預期的,並且

b.move(2,0);
alert(b); // [2,,];

因此它也不是穩定的。

暫無
暫無

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

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