javascript - sort - js array remove




Javascript將數組值推入另一個數組 (9)

我有一個JavaScript數組dataArray ,我想推入一個新的數組newArray 。 除了我不希望newArray[0]dataArray 。 我想推入所有的值到新的數組中:

var newArray = [];

newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...

甚至更好:

var newArray = new Array (
   dataArray1.values(),
   dataArray2.values(),
   // ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);

所以現在新數組包含了各個數據數組的所有值。 是否有像pushValues這樣的簡寫可用,所以我不必遍歷每個單獨的dataArray,將值1加1?


下面的函數與陣列的長度沒有關係,並且性能比所有建議的解決方案都要好:

function pushArray(list, other) {
    var len = other.length;
    var start = list.length;
    list.length = start + len;
    for (var i = 0; i < len; i++ , start++) {
        list[start] = other[i];
    }
}

不幸的是,jspref拒絕接受我的提交,所以在這裡他們是使用benchmark.js的結果

        Name            |   ops/sec   |  ± %  | runs sampled
for loop and push       |      177506 |  0.92 | 63
Push Apply              |      234280 |  0.77 | 66
spread operator         |      259725 |  0.40 | 67
set length and for loop |      284223 |  0.41 | 66

哪裡

for循環和推送是:

    for (var i = 0, l = source.length; i < l; i++) {
        target.push(source[i]);
    }

推送應用:

target.push.apply(target, source);

傳播運營商:

    target.push(...source);

最後'set length and for loop'就是上面的函數


以下對我來說似乎最簡單:

var newArray = dataArray1.slice();
newArray.push.apply(newArray, dataArray2);

由於“push”需要可變數量的參數,因此可以使用push函數的apply方法來推送另一個數組的所有元素。 它構造了一個調用,使用它的第一個參數(此處為“newArray”)作為“this”,並將該數組的元素作為剩餘的參數。

第一條語句中的slice獲取第一個數組的副本,所以您不要修改它。

更新如果您正在使用可用切片的JavaScript版本,則可以push表達式簡化為:

newArray.push(...dataArray2)

使用JavaScript ES6,您可以將...運算符用作擴展運算符,它將本質上將數組轉換為值。 然後,你可以做這樣的事情:

var myArray = [1,2,3,4,5];
var moreData = [6,7,8,9,10];

myArray = [
  ...myArray,
  ...moreData,
];

雖然語法簡潔,但我不知道這是如何在內部工作的,以及對大型數組的性能影響。


假如你的數組不是很大(見下面的警告),你可以使用你希望追加值的數組的push()方法。 push()可以接受多個參數,因此您可以使用它的apply()方法傳遞值的數組作為函數參數列表。 這與使用concat()將數組添加到數組中而不是創建新數組相比具有優勢。

但是,對於大型陣列(大約100,000個成員或更多), 這個技巧可能會失敗 。 對於這樣的數組,使用循環是一種更好的方法。 有關詳細信息,請參閱https://.com/a/17368101/96100 。

var newArray = [];
newArray.push.apply(newArray, dataArray1);
newArray.push.apply(newArray, dataArray2);

你可能想把它推廣到一個函數中:

function pushArray(arr, arr2) {
    arr.push.apply(arr, arr2);
}

...或將其添加到Array的原型:

Array.prototype.pushArray = function(arr) {
    this.push.apply(this, arr);
};

var newArray = [];
newArray.pushArray(dataArray1);
newArray.pushArray(dataArray2);

...或通過使用concat() (如push()這一事實允許多個參數來允許多個參數來模擬原始的push()方法:

Array.prototype.pushArray = function() {
    this.push.apply(this, this.concat.apply([], arguments));
};

var newArray = [];
newArray.pushArray(dataArray1, dataArray2);

以下是最後一個示例的基於循環的版本,適用於大型數組和所有主流瀏覽器,包括IE <= 8:

Array.prototype.pushArray = function() {
    var toPush = this.concat.apply([], arguments);
    for (var i = 0, len = toPush.length; i < len; ++i) {
        this.push(toPush[i]);
    }
};

我們有兩個數組a和b。 代碼是什麼在這裡是一個數組被推入到數組b中。

let a = [2, 4, 6, 8, 9, 15]

function transform(a) {
    let b = ['4', '16', '64']
    a.forEach(function(e) {
        b.push(e.toString());
    });
    return b;
}

transform(a)

[ '4', '16', '64', '2', '4', '6', '8', '9', '15' ]

我會再增加一個“面向未來”的答复

在ECMAScript 6中,您可以使用spread運算符

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1.push(...arr2);

Spread運算符尚未包含在所有主流瀏覽器中。 有關當前的兼容性,請參閱此(不斷更新)的兼容性表

但是,您可以在Babel.js使用擴展運算符。


有幾個關於MDN的答案。 這是一個明顯的例子:

var dataArray1 = [1, 2];
var dataArray2 = [3, 4, 5];
var newArray = [ ];
Array.prototype.push.apply(newArray, dataArray1); // newArray = [1, 2]
Array.prototype.push.apply(newArray, dataArray2); // newArray = [1, 2, 3, 4, 5]
console.log(JSON.stringify(newArray)); // Outputs: [1, 2, 3, 4, 5]

如果你有ES6語法:

var dataArray1 = [1, 2];
var dataArray2 = [3, 4, 5];
var newArray = [ ];
newArray.push(...dataArray1); // newArray = [1, 2]
newArray.push(...dataArray2); // newArray = [1, 2, 3, 4, 5]
console.log(JSON.stringify(newArray)); // Outputs: [1, 2, 3, 4, 5]


而不是push()函數為IE使用concat函數。 例,

var a=a.concat(a,new Array('amin'));

var a=new Array('a','b','c');
var b=new Array('d','e','f');
var d=new Array('x','y','z');
var c=a.concat(b,d)

這能解決你的問題嗎?





arrays