Pristup nizu elemenata objekata u redu iz polja objekta?

Imam JS objekt koji ima sljedeći isječak:

 { "foo": "bar", "baz": [ { "order": 2, "fruit": "banana" }, { "order": 1, "fruit": "apple" }, { "order": 3, "fruit": "peach" }, ] } 

Moj cilj je biti u mogućnosti ponoviti sve objekte u bazu, ali u skladu s njegovim svojstvom reda, a ne redoslijedom pohranjenim u objektu. Redoslijed objekata u "bazu" se može / često mijenjati, tako da njihovo sortiranje ranije ili pohranjivanje u redoslijedu kojim bi trebali biti nije opcija.

Čisti js ili jQuery odgovor je prihvatljiv.

-5
08 авг. postavio Felix Jen 08 aug. 2017-08-08 07:56 '17 u 7:56 2017-08-08 07:56
@ 3 odgovora

Bok, morate sortirati objekt. Samo upotrijebite polje .sort za ovo.

Evo primjera:

1
08 авг. odgovori dani archos 08 Aug. 2017-08-08 08:00 '17 u 8:00 2017-08-08 08:00

Rekao si

Redoslijed objekata u "bazu" se može / često mijenja ...

Ako to doslovno znači, a ne da im se mijenja svojstvo order , možete dati sebi drugi niz, odvojen od baz , koji sadrži objekte u redu. Onda nije bitno kojim redoslijedom se nalaze u baz .

 var bazInOrder = theObject.baz.slice(); bazInOrder.sort(function(a, b) { return a.order - b.order; }); 

Ako dodajete unos baz , morate ga dodati (u razvrstanoj poziciji) na bazInOrder ; i isto tako, ako izbrišete unos iz baz , želite ga izbrisati iz bazInOrder .


border=0

Druga mogućnost je da im dodate svojstvo koje označava "sljedeći" unos; na primjer, povezivanje popisa na niz. To opet zahtijeva pošteno održavanje prilikom dodavanja / uklanjanja, ali ne samo kada se mijenja njihov redoslijed u baz .

 theObject.baz.slice() .sort(function(a, b) { return a.order - b.order; }) .forEach(function(entry, index, arr) { entry.next = index < arr.length - 1 ? arr[index + 1] : null; }); 

tada pristup njima u redoslijedu zahtijeva redoslijed pretraživanja order = 1 , a zatim ciklus sa next :

 for (var e = theObject.baz.find(function(e) { return e.order === 1; }); e; e = e.next) { // ...use 'e'... } 

Opet, povezani popisi uključuju održavanje za dodavanje / uklanjanje.

0
08 авг. Odgovor daje TJ Crowder 08 aug. 2017-08-08 08:00 '17 u 8:00 2017-08-08 08:00

Mislim da možete stvoriti polje s izvornim baz indeksom po redu baz[n].order

pomalo

 var obj = { "foo": "bar", "baz": [ { "order": 2, "fruit": "banana" }, { "order": 1, "fruit": "apple" }, { "order": 3, "fruit": "peach" }, ] } var bazIndexOrder = obj.baz .map(({order}, index) => ({index, order})) .sort(({order:a}, {order:b}) => a - b) .map(({index}) => index); console.log(bazOrder); // [1, 0, 2] bazOrder.forEach(index => console.log(obj.baz[index].fruit)); // apple, banana, peach 

Ako vas kod ES2015 + plaši, ovo

 var bazIndexOrder = obj.baz.map(function (_ref, index) { var order = _ref.order; return { index: index, order: order }; }).sort(function (_ref2, _ref3) { var a = _ref2.order; var b = _ref3.order; return a - b; }).map(function (_ref4) { var index = _ref4.index; return index; }); 
0
08 авг. odgovor je dao Jaromanda X 08 aug. 2017-08-08 08:07 '17 u 8:07 2017-08-08 08:07