2014-07-10 17 views
88

Jak mogę przekształcić duży object w array z domieszką?przekształcić obiekt na tablicę z domieszką

Przykład:

var obj = { 
    22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[],} 
    12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[],} 
} 

// transform to 
var arr = [{name:"John", id:22...},{name:"Ivan", id:12...}] 

Dzięki!

+2

Myślę, że powinieneś odnieść się do dokumentów przynajmniej raz. – Mritunjay

Odpowiedz

152

Można zrobić

var arr = _.values(obj); 

Dla dokumentacji zobaczyć here.

+13

Co jeśli chcesz zachować klucz jako własność? (w tym przykładzie, jeśli właściwość 'id' nie istnieje i chcesz ją utworzyć w oparciu o klucz każdego obiektu, –

+6

Możesz zrobić coś takiego:' var arr = _.values ​​(_. mapKeys (obj, function (value, key) {value.id = klucz; return value;})); ' –

+0

@DanielSchmidt Nie jestem pewien, co zrobiłem źle, ale ta próbka zwróciła mi tylko jeden wiersz. :(Więc to co zrobiłem to ręcznie przesuń wartość 'return' do następującej tablicy:' const divisionsList = []; _.mapKeys (divisions, (value, key) => {divisionsList [key] = value;}); 'Doceniam komentarze lub sugestie dotyczące poprawy tego podejścia – JohnnyQ

22
_.toArray(obj); 

Wyjścia jako:

[ 
    { 
    "name": "Ivan", 
    "id": 12, 
    "friends": [ 
     2, 
     44, 
     12 
    ], 
    "works": { 
     "books": [], 
     "films": [] 
    } 
    }, 
    { 
    "name": "John", 
    "id": 22, 
    "friends": [ 
     5, 
     31, 
     55 
    ], 
    "works": { 
     "books": [], 
     "films": [] 
    } 
    } 
]" 
+3

https://lodash.com/docs#toArray – ptim

6

Jeśli chcesz klucz (ID w tym przypadku) być zachowane jako właściwość każdego elementu tablicy można wykonać:

const arr = _(obj) //wrap object so that you can chain lodash methods 
      .mapValues((value, id)=>_.merge({}, value, {id})) //attach id to object 
      .values() //get the values of the result 
      .value() //unwrap array of objects 
1

Nowoczesne rozwiązanie natywne, jeśli ktokolwiek jest zainteresowany.

const arr = Object.keys(obj).reduce((arr, key) => 
    ([...arr, { ...obj[key], key }]), // Can add key if you don't have it 
[]); 

Uwaga Zniknęłoby niezmienności na bardzo dużych listach.

+0

dlaczego nie tylko 'Object.keys (obj) .map (key => ({key, value: obj [key]})) ' –

2

Oprócz wszystkich dotychczasowych odpowiedzi (które są naprawdę dobre, a doskonały), po prostu dodając kolejne podejście tutaj:

Można użyć _.map funkcji (zarówno lodash i underscore) z object jak dobrze, to będzie wewnętrznie obsłużyć ten przypadek, iterować po każdej wartości i klucz z iteratee, a na końcu zwrócić tablicę. W rzeczywistości, możesz go użyć bez iteratee (tylko _.map(obj)), jeśli chcesz tylko tablicy wartości. Dobrą stroną jest to, że jeśli potrzebujesz jakiejkolwiek transformacji, możesz to zrobić za jednym razem.

Przykład:

var obj = { 
 
    key1: {id: 1, name: 'A'}, 
 
    key2: {id: 2, name: 'B'}, 
 
    key3: {id: 3, name: 'C'} 
 
}; 
 

 
var array1 = _.map(obj, v=>v); 
 
console.log('Array 1: ', array1); 
 

 
/*Actually you don't need the callback v=>v if you 
 
are not transforming anything in between, v=>v is default*/ 
 

 
//SO simply you can use 
 
var array2 = _.map(obj); 
 
console.log('Array 2: ', array2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

Jednakże, jeśli chcesz zmienić swój przedmiot można zrobić, nawet jeśli trzeba zachować klucz, można to zrobić (_.map(obj, (v, k) => {...}) z dodatkowy argument w map, a następnie użyj go, jak chcesz.

+0

Ładne, bardzo proste i najbardziej zwięzłe. – edencorbin

3

Aktualizacja 2017: Object.values, złożyć values i toArray zrobić.I zachować klucze map i spread operator zabaw Nicea:

// import { toArray, map } from 'lodash' 
 
const map = _.map 
 

 
const input = { 
 
    key: { 
 
    value: 'value' 
 
    } 
 
} 
 

 
const output = map(input, (value, key) => ({ 
 
    key, 
 
    ...value 
 
})) 
 

 
console.log(output) 
 
// >> [{key: 'key', value: 'value'}])
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

10

Dla mnie to działało:

_.map(_.toPairs(data), d => _.fromPairs([d])); 

Okazuje

{"a":"b", "c":"d", "e":"f"} 

do

[{"a":"b"}, {"c":"d"}, {"e":"f"}] 
+0

proszę wyjaśnić to nieco lepiej ...! –

+0

Potrzebowałem przekształcić obiekt w tablicę, w taki sposób, że każdy klucz/wartość oryginalnego obiektu byłby obiektem {key: value} -object w tablicy. _.toPairs (dane) pobiera obiekt {"a": "b", "c": "d", "e": "f"} i zwraca go jako tablicę tablic takich jak [["a" : "b"], ["c": "d"], ["e": "f"]]. _.fromPairs robi odwrotność, pobiera tablicę z 2 elementami: ["a", "b"] i zwraca ją jako obiekt: {"a": "b"}. Używając _.map, wykonałem iterację po tablicy, jeśli tablice utworzone przez _.toPairs przekształcą ją w tablicę obiektów za pomocą _.fromPairs. – NoNine

0

Jeśli chcesz trochę niestandardowe odwzorowania (jak oryginalny Array.prototype.map) Object do tablicy, można po prostu użyć _.forEach:

let myObject = { 
    key1: "value1", 
    key2: "value2", 
    // ... 
}; 

let myNewArray = []; 

_.forEach(myObject, (value, key) => { 
    myNewArray.push({ 
    someNewKey: key, 
    someNewValue: value.toUpperCase() // just an example of new value based on original value 
    }); 
}); 

// myNewArray => [{ someNewKey: key1, someNewValue: 'VALUE1' }, ... ]; 

Zobacz lodash DOC _.forEach https://lodash.com/docs/#forEach

Powiązane problemy