Создайте два массива из коллекции свойств и значений объекта с помощью lodash

У меня есть массив, содержащий объекты, например:

[{
 "first" : 1
},
{
 "second" : 2
},
{
 "third" : 3
}]

Я хочу превратить это в два массива с сопоставлением индексов на основе этих значений, например:

["first","second","third"]
[1,2,3]

Я могу повторить это и получить ключи и значения объекта, но я чувствую, что в lodash должен быть удобный способ сделать это, о котором я не знаю. Какие-либо предложения? Благодарю вас!


person dzm    schedule 27.04.2015    source источник
comment
Каждый элемент в вашем массиве имеет другую форму. Я подозреваю, что другая структура лучше удовлетворит ваши потребности, если вы выполняете такие операции. Например, массив кортежей может быть лучше: [['first', 1], ['second', 2], ['third', 3]]   -  person Levi Morrison    schedule 28.04.2015
comment
Ну, это для библиотеки диаграмм, которая использует эту структуру для меток и данных.   -  person dzm    schedule 28.04.2015


Ответы (3)


Для решения, отличного от lodash:

var arr = [{"first" : 1},{"second" : 2},{"third" : 3}];
var keys = arr.map(function(el){return Object.keys(el)[0];});
var vals = arr.map(function(el){return el[Object.keys(el)[0]];});

Для противоположной проблемы (несколько массивов в один массив объектов) см. property-values">Объединить два массива в массив объектов со значениями свойств

person S McCrohan    schedule 27.04.2015

Похоже, вам просто нужно сопоставить объект и вызвать keys() и values()

Вы получите первый массив, например:

var items = [{a: "1"},{b: "blah",c: "what"},{d: "3"}]
keys = _(items).map(_.keys).flatten().value()

возвращает ["a","b","c","d"]

И второй массив вроде:

values = _(items).map(_.values).flatten().value()

возвращает ["1","blah","what","3"]

person wrshawn    schedule 27.04.2015

Предполагая, что форма вашего объекта всегда {"label": value}, вы можете использовать этот ванильный JavaScript:

var data = [{"first" : 1},{"second" : 2},{"third" : 3}];
var labels = data.map(function(entry) {
    return Object.keys(entry)[0];
});
var values = data.map(function(entry) {
    return entry[Object.keys(entry)[0]];
});

Судя по вашим комментариям, ваша структура данных кажется неоптимальной. Я бы рекомендовал альтернативную структуру:

var data = [
    {'label': 'first', 'value': 1},
    {'label': 'second', 'value': 2},
    {'label': 'third', 'value': 3}
]

Затем тривиально выделить метки и значения в отдельные части в обычном JavaScript:

var labels = data.map(function(entry) {
    return entry.label;
});
var values = data.map(function(entry) {
    return entry.value;
});

Или, если вы действительно хотите использовать lodash:

var labels = _.pluck(data, 'label');
var values = _.pluck(data, 'value');

Надеюсь, вы видите, что эта измененная структура делает JavaScript намного проще, независимо от того, используете вы lodash или нет.

person Community    schedule 27.04.2015