2013-08-08 10 views
23

配列内のすべてのオブジェクトから「不良」属性を削除します。 forループを使用してすべてのオブジェクトから削除するよりも、より良い方法がありますか?Javascript:配列内のすべてのオブジェクトの属性を削除します

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

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

プロトタイプなどを使用する方法があるようです。知りません。アイデア?

+1

は関係ありません、他の方法では得ることができません線形のO(n)より小さい。何を使用するにしても、すべての配列要素にアクセスする必要があります – Brian

+0

プロトタイプ?どのように役立つだろうか?あるいは、すべてのオブジェクトが同じコンストラクタのインスタンスであり、「不良」の共通の値を共有していますか? – Bergi

+1

@BergiプロトタイプのJSを指しているのだろうか、またはdystroyが例示した 'Array'プロトタイプを参照しているのだろうか。 – Ian

答えて

30

唯一の他の方法は化粧品であり、実際にはループです。例えば

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

注意あなたがIE8と互換性を持つようにしたい場合は、あなたがa shim for forEachを必要とするだろうと。 prototypeについても触れますが、prototype.jsもhas a shimです。あなたのオブジェクトが似ているときのプロトタイプを使用して

+1

ループが "擬似"になることが許されていれば、ループよりもそれほど優れていませんが、一行も並んでいます:P' for(var i = 0; i Esailija

+1

@Esailijaは異なります。私はコードをより表現力豊かにしているため(そして、私はずっと前にIEについて心配しなくなったので)、forEachを使うのが好きです。 –

+1

どちらも、「この配列内のすべてのオブジェクトの不良プロパティを削除する」という表現は全く異なります。 'forEach'は一般的であり、' for'ループのように意味的に無意味です。 – Esailija

7

ソリューションにのみ可能である:

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; 
6

私はプロパティを削除するためにマップを使用することを好むと新しい配列項目を返します。

array.map(function(item) { 
    delete item.bad; 
    return item; 
}); 
+1

これは元の配列を変更することに注意してください –

5

あなたがunderscore.jsを使用する場合:

ES6で
var strippedRows = _.map(rows, function (row) { 
    return _.omit(row, ['bad', 'anotherbad']); 
}); 
2

、あなたは指定された属性なしで新しいものを作成するために、各オブジェクトを分解するが:

const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs) 
関連する問題