2013-08-08 20 views
23

Chcę usunąć "zły" atrybut z każdego obiektu w tablicy. Czy jest lepszy sposób, aby to zrobić niż przy użyciu pętli for i usuwania jej z każdego obiektu?Javascript: Usuń atrybut dla wszystkich obiektów w tablicy

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

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

Wygląda na to, że powinien istnieć sposób na użycie prototypu lub coś podobnego. Nie wiem Pomysły?

+1

nie ma znaczenia, inne sposoby nie mogą dostać mniej niż liniowy O (n). Cokolwiek użyjesz, będzie wymagało dostępu do wszystkich elementów tablicy – Brian

+0

Prototyp? Jak by to pomogło? Czy wszystkie są tymi obiektami tego samego konstruktora i mają wspólną wartość "złego"? – Bergi

+1

@Bergi Zastanawiam się, czy odnosiły się one do prototypeJS, czy też do prototypu 'Array', który dystroy ilustruje: – Ian

Odpowiedz

30

Jedynymi innymi sposobami są kosmetyczne i są w rzeczywistości pętle.

Na przykład:

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

Pamiętaj, że jeśli chcesz być zgodna z IE8, to że trzeba a shim for forEach. Jak wspomniałeś o prototypie, prototype.js również has a shim.

+1

Niewiele lepiej niż w pętli, jeśli pętla może być "fałszywa" - również podświetlona: P 'dla (var i = 0; i Esailija

+1

@Eailailija Depends. Lubię używać 'forEach', ponieważ uważam, że kod jest bardziej wyrazisty (i ponieważ przestałem martwić się o IE już dawno temu). –

+1

Żadne z nich nie wyraża "usuń niepoprawną właściwość wszystkich obiektów w tej tablicy" w radykalnie inny sposób. 'forEach' jest samoistne i semantycznie pozbawione sensu, jak pętla' for'. – Esailija

7

Rozwiązanie za pomocą prototypów jest możliwe tylko, gdy obiekty są podobne:

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

Ale wtedy jest to proste (i O(1)):

delete Cons.prototype.bad; 
6

wolę używać mapy, aby usunąć właściwość i następnie zwróć nowy element tablicy.

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

Należy pamiętać, że powoduje to mutację oryginalnej tablicy –

5

Jeśli używasz underscore.js:

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

Z ES6, można dekonstrukcji każdy obiekt, aby utworzyć nowy bez wymienionych cech:

const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs) 
Powiązane problemy