172

bad配列内のすべてのオブジェクトからプロパティを削除したい。forループを使用してすべてのオブジェクトから削除するよりも良い方法はありますか?

var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"},...];

for (var i = 0, len = array.length; i < len; i++) {
  delete array[i].bad;
}

prototype、または何かを使用する方法があるはずです。知らない。アイデア?

4

18 に答える 18

299

ES6 では、各オブジェクトを分解して、名前付き属性のない新しいオブジェクトを作成できます。

const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)
于 2017-10-19T21:47:01.563 に答える
162

他の唯一の方法は表面的なものであり、実際にはループです。

例えば ​​:

array.forEach(function(v){ delete v.bad });

ノート:

  • IE8 と互換性を持たせたい場合は、 forEach のシムが必要です。プロトタイプに言及したように、prototype.js にもshim があります。
  • delete最悪の「最適化キラー」の 1 つです。これを使用すると、アプリケーションのパフォーマンスが低下することがよくあります。本当にプロパティを削除したい場合は避けられませんが、多くの場合、プロパティを設定するか、プロパティundefinedなしで新しいオブジェクトを構築することができます。
于 2013-08-08T18:42:24.213 に答える
16

underscore.jsを使用する場合:

var strippedRows = _.map(rows, function (row) {
    return _.omit(row, ['bad', 'anotherbad']);
});
于 2016-02-09T18:42:17.393 に答える
8

プロトタイプを使用したソリューションは、オブジェクトが似ている場合にのみ可能です。

function Cons(g) { this.good = g; }
Cons.prototype.bad = "something common";
var array = [new Cons("something 1"), new Cons("something 2"), …];

しかし、それは簡単です(そしてO(1)):

delete Cons.prototype.bad;
于 2013-08-08T18:47:31.837 に答える
2

この質問は今では少し古いですが、ソースデータを変更せず、手作業を最小限に抑える代替ソリューションを提供したいと思います。

function mapOut(sourceObject, removeKeys = []) {
  const sourceKeys = Object.keys(sourceObject);
  const returnKeys = sourceKeys.filter(k => !removeKeys.includes(k));
  let returnObject = {};
  returnKeys.forEach(k => {
    returnObject[k] = sourceObject[k];
  });
  return returnObject;
}

const array = [
  {"bad": "something", "good":"something"},
  {"bad":"something", "good":"something"},
];

const newArray = array.map(obj => mapOut(obj, [ "bad", ]));

まだ完璧とは言えませんが、ある程度の不変性が維持されており、削除したい複数のプロパティに名前を付ける柔軟性があります。(提案を歓迎します)

于 2020-01-03T20:29:43.623 に答える
0
const arr = [
  {id: 1, name: 'user1', test: 'abc'},
  {id: 2, name: 'user2', test: 'xyz'},
];

const newArr = arr.map(({test, ...rest}) => {
  return rest;
});

console.log(newArr);
// ️ [{id: 1, name: 'User1'},  {id: 2, name: 'User2'}]

Array.map メソッドに渡す関数は、配列内の各要素で呼び出されます。

各オブジェクトからテスト プロパティを分解し、残りの演算子 (...) を使用してオブジェクトの残りのプロパティを取得します。

関数からオブジェクトの残りのプロパティを返しますが、テスト プロパティは実質的に除外されます。

const arr = [
  {id: 1, name: 'Tom', test: 'abc'},
  {id: 2, name: 'Bob', test: 'xyz'},
];

arr.forEach(object => {
  delete object['test'];
});

console.log(arr);
// ️ [{id: 1, name: 'Tom'}, {id: 2, name: 'Bob'}]
于 2020-08-18T09:31:11.433 に答える