3

私は次のコードを持っています:

var a = [{a: 1}, {a: 2}, {a: 3}];
a.map(function (item, index) {
  console.log('call');
  if (index < 1) {
    a.splice(index, 1);
  }
});

しかし、call は 2 回しか表示されず、3 回表示されることを期待しています。splice配列が台無しになっていることは知っていますが、この動作の回避策はありますか?

ありがとうございました!

4

3 に答える 3

4

map のコールバックには、それ自身の配列である 3 番目の引数があります。

var a = [{a: 1}, {a: 2}, {a: 3}];
a.map(function (item, index, a2) {
  console.log('call');
  if (index < 1) {
    a2.splice(index, 1);
  }
});

これはhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/mapからの場合

map によって処理される要素の範囲は、コールバックの最初の呼び出しの前に設定されます。map の呼び出しが開始された後に配列に追加された要素は、コールバックによってアクセスされません。配列の既存の要素が変更または削除された場合、コールバックに渡される値は、map がそれらの要素にアクセスしたときの値になります。削除された要素は訪問されません。

于 2015-03-19T16:05:31.177 に答える
4

配列の浅いコピーを作成します。

a.slice().map(function (item, index) {

ちなみに、forEach値を返さないので、おそらく使用する必要があります。

またはさらに良いことに、filter代わりに使用することを検討しましたか?

var a = [{a: 1}, {a: 2}, {a: 3}].filter(function (item, index) {
  console.log('call');
  return index >= 1;
});
于 2014-04-30T22:52:14.050 に答える