2015-08-19 18 views

Odpowiedz

24

Można użyć lodash na _.map():-tych

var obj = { 
 
    prop1 : "value", 
 
    prop2: { sub:1} 
 
}; 
 

 
var result = _.map(obj, function(value, prop) { 
 
    return { prop: prop, value: value }; 
 
}); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>

Albo można to zrobić za pomocą ES6 array destructuring z Shorthand property names i Object#entries (ECMAScript 2017 Projekt) lub lodash _.entries:

const obj = { 
 
    prop1 : "value", 
 
    prop2: { sub:1} 
 
}; 
 

 
const result = Object.entries(obj).map(([prop, value]) => ({ prop, value })); 
 

 
console.log(result);

+0

Oznaczyłem to jako odpowiedź, ponieważ pasuje do mojego problemu, używając do tego celu "podszewki". Jednak dodałem stronę _.map do strony jsperf, porównując je. http://jsperf.com/loop-for-in-vs-object-keys-foreach/19 (przepraszam dodatkowy fragment, który ktoś dodał do tablicy op - całkowicie zepsuł test), ale porównując forOwn z mapą, nie przynosi to żadnej korzyści – sambomartin

+0

Korzyści nie wynikają z wydajności, ale z "oneliner jest już dostępny, aby to zrobić" zgodnie z życzeniem :) W każdym razie pamiętaj, że różnica w wydajności jest zauważalna tylko w bardzo dużej ilości przedmiotów, i jeśli to nie jest problem, należy użyć '_.map() 'ponieważ jest bardziej czytelny (przynajmniej dla mnie). –

9

Nie trzeba nawet lodash za to:

var arr = Object.keys(obj).map(function(key){ 
    return { key: key, value: obj[key] }; 
}); 
+0

dzięki za odpowiedź, co ciekawe Object.keys jest wolniejszy niż forOwn. http://jsperf.com/loop-for-in-vs-object-keys-foreach/19 - ktoś zepsuł test, dodając do niego trochę tablic, ale spójrz na Object.keys kontra _.forOwn a nowy dodałem _.map – sambomartin

+0

@sambomartin Oczywiście będzie to "szybsze", ponieważ wewnętrznie na miejscu używa tylko pętli 'while' dla iteracji. Ale potem znowu pytanie nigdy nie wymagało wykonania, ale czegoś, co jest już dostępne. – Joseph

1

Można użyć pairs czy pasuje sprawy:

_.pairs({ 'barney': 36, 'fred': 40 }); 
// → [['barney', 36], ['fred', 40]] 

Ref: https://lodash.com/docs#pairs

+0

Ale to nie pasuje do jego przypadku. –

1

W odpowiedzi na komentarz Ori i kompletności, jakie opublikował wersję _.forOwn. Jest marginalnie szybszy, ale musisz najpierw zadeklarować tablicę (not-a-one-liner).

var arr = []; 
_.forOwn(obj,function(item, key) { 
    arr.push({ property : key, value : item}); 
}); 
+0

@ori to jest wersja forOwn. dzięki za pomoc. (http://jsperf.com/loop-for-in-vs-object-keys-foreach/19) – sambomartin

9

Trochę ES6:

_.map(obj, (value, key) => ({key,value}))

2

Jeśli używasz lodash/fp można użyć _.entries

const a = { one: 123, two: { value: 'b' }}; 
 

 
const pairs = _.entries(a).map(p => ({ key:p[0], value: p[1] })) 
 

 
console.log(pairs) 
 
// [ 
 
// { 
 
//  "key": "one", 
 
//  "value": 123 
 
// }, 
 
// { 
 
//  "key": "two", 
 
//  "value": { 
 
//  "value": "b" 
 
//  } 
 
// } 
 
// ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-fp/4.15.0/lodash-fp.js"></script>

Powiązane problemy