web-dev-qa-db-ja.com

通常のPushとArray.prototype.Push.applyの違いは何ですか

次の2行のコードの違いがよくわかりません。私のコードでは、「apply」の行は希望どおりに機能しますが、通常のPushの行は機能しません。

したがって、これらの両方が実行されたときに実際に何が起こっているのでしょうか。

//this one does not work the way i want it to
$scope.items.Push(result.data.stuff)

//this one works!
Array.prototype.Push.apply($scope.items, result.data.stuff);

編集:混乱して申し訳ありませんが、「プッシュ」メソッドが含まれるように修正しました

9
user3092075

新規1.配列をアイテムにプッシュします。

$scope.items = [1, 2];
result.data.stuff = [3, 4];
$scope.items.Push(result.data.stuff);
$scope.items[0] === 1;
$scope.items[1] === 2;
$scope.items[2][0] === 3;
$scope.items[2][1] === 4;

古い1.$scope.itemsにあった既存の参照を削除します。

$scope.items = [1, 2];
result.data.stuff = [3, 4];
$scope.items = result.data.stuff;
$scope.items[0] === 3;
$scope.items[1] === 4;

2.既存のアイテムを保持したまま、すべてのアイテムをresult.data.stuffから$scope.itemsにプッシュします。

$scope.items = [1, 2];
result.data.stuff = [3, 4];
Array.prototype.Push.apply($scope.items, result.data.stuff);
$scope.items[0] === 1;
$scope.items[1] === 2;
$scope.items[2] === 3;
$scope.items[3] === 4;
13
Daniel A. White

Array.prototype.Push()は、配列の最後に1つ以上の要素を追加し、配列の新しい長さを返すメソッドです。 Array.prototype.Push.apply()は、元の配列と、元の配列に追加する要素を含む配列を取ります。

Array.prototype.Push()の例:

_var numbers = [1, 5, 2, 8];
numbers.Push(3, 4, 6, 7);
console.log(numbers); // [1, 5, 2, 8, 3, 4, 6, 7]
_

ネストされた配列を使用したArray.prototype.Push()の例:

_var foods = [['apples', 'pears']];
foods.Push(['lettuce', 'celery']);
console.log(foods); // [['apples', 'pears'], ['lettuce', 'celery']]
_

Array.prototype.Push.apply()の例:

_var grades = [90, 88, 83, 85];
var more_grades = [79, 84, 81, 90];
Array.prototype.Push.apply(grades, more_grades);
console.log(grades); // [90, 88, 83, 85, 79, 84, 81, 90]
_

ネストされた配列を使用したArray.prototype.Push.apply()の例:

_var sports = [['running', 'cycling']];
var other_sports = [['football', 'basketball']];
Array.prototype.Push.apply(sports, other_sports);
console.log(sports);
// [['running', 'cycling'], ['football', 'basketball']]
_

参照:

プッシュ

適用

7
exd5cxd4

Push()は、渡す引数ごとに1つのインデックスを追加します。配列に何を追加するかは関係ありません。追加するように指示すると、配列の最後に追加されます。

apply() を使用すると、指定した配列を2番目の引数として受け取り、複数の引数に変換します。 MDNはそれをうまく説明しています 、しかしそれは基本的にそれをに変えます

yourArray.Push(argument[0],argument[1],argument[2],argument[3]);
3
epascarello

参照: MDN:Function.prototype.apply() ;

このページの注記に注意してください:

注:この関数の構文はcall()の構文とほぼ同じですが、基本的な違いは、call()が引数リストを受け入れるのに対し、apply()は引数の単一配列を受け入れることです。

apply()メソッドは、指定されたthis値、および配列(または配列のようなオブジェクト)として提供される引数を使用して関数を呼び出します。 argsArray(2番目のパラメーター)内のすべての項目は、_Array.prototype.Push_に順番に使用されます。これは次と同じです。

$scope.items.Push.apply($scope.items, result.data.stuff);

_$scope.items.Push === Array.prototype.Push_およびapply()は配列のようなパラメーターを受け入れますが、 Function.prototype.call() は引数リストを受け入れるためです。

簡単に言えば、applyは、配列のようなパラメーターをその関数の断片に変換します。

1
Chosan

_$scope.items = result.data.stuff_はArray.prototype.Push.apply($scope.items, result.data.stuff);と同等ではないと思います

最初は配列を再割り当てするため(古い要素をクリアする)

これを試して:

_$scope.items.Push(result.data.stuff[0], result.data.stuff[1], ...);
_

または

$scope.items.Push.apply($scope.items, result.data.stuff);

$ scope.itemsは配列であるため、上記はArray.prototype.Push.applyを呼び出すことと同じです(私たちはそれを考えています)

他のジョイナー関数があります:

_$scope.items = $scope.items.concat(result.data.stuff);
_
0
Dániel Kis