По какой-то причине у меня возникает немало трудностей при попытке преобразовать объекты и массивы.

У меня есть текущие данные, которые хранятся в коллекции mongodb и выглядят так:

[{ "_id" : 1, "name" : "someName", "colorName" : "Pink"},
{ "_id" : 2, "name" : "someName2", "colorName" : "RoyalBlue"},
{ "_id" : 3, "name" : "aThirdOne", "colorName" : "Gold"},
{ "_id" : 4, "name" : "oneMore", "colorName" : "LightGreen"}]

Мне нужно получить либо следующие два массива, но я хотел бы знать, как получить оба.

[{ "value" : 1, "label" : "someName"},
{ "value" : 2, "label" : "someName2"},
{ "value" : 3, "label" : "aThirdOne"},
{ "value" : 4, "label" : "oneMore"]

[{1 : "someName"},
{2 : "someName2"},
{3 : "aThirdOne"},
{4 : "oneMore"}]

Я знаю, что это, вероятно, что-то с _.map, но я не уверен, почему я не могу понять это. Пожалуйста, порекомендуйте.

1
0xPingo 15 Дек 2015 в 19:16

3 ответа

Лучший ответ

Для этого вам не нужен Underscore, это просто нормально Использование метода Array.prototype.map (хотя Underscore также предоставляет этот метод):

var data = [{ "_id" : 1, "name" : "someName", "colorName" : "Pink"},
    { "_id" : 2, "name" : "someName2", "colorName" : "RoyalBlue"},
    { "_id" : 3, "name" : "aThirdOne", "colorName" : "Gold"},
    { "_id" : 4, "name" : "oneMore", "colorName" : "LightGreen"}];
    
var result = data.map(function(el, i) {
    return {value: el._id, label: el.name};
});

document.body.innerHTML = '<pre>' + JSON.stringify(result, null, 4) + '</pre>';

Также обратите внимание, что ваша вторая структура данных не имеет смысла, потому что она нерегулярна, поэтому не используйте ее, это совсем не очень удобно.

И вот соответствующая версия Underscore:

// Or Underscore version
var result = _.map(data, function(el) {
    return {value: el._id, label: el.name};
});
2
dfsq 15 Дек 2015 в 16:26

В простом Javascript вы можете использовать Array.prototype.forEach() для итерации по массиву и сборки объектов и передачи его к желаемым результатам.

Метод forEach() выполняет предоставленную функцию один раз для каждого элемента массива.

var array = [{ "_id": 1, "name": "someName", "colorName": "Pink" }, { "_id": 2, "name": "someName2", "colorName": "RoyalBlue" }, { "_id": 3, "name": "aThirdOne", "colorName": "Gold" }, { "_id": 4, "name": "oneMore", "colorName": "LightGreen" }],
    result1 = [],
    result2 = [];

array.forEach(function (a) {
    result1.push({ value: a._id, label: a.name });
    var o = {};
    o[a._id] = a.name
    result2.push(o);
});

document.write('<pre>' + JSON.stringify(result1, 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(result2, 0, 4) + '</pre>');
1
Nina Scholz 15 Дек 2015 в 16:23

Использование:

var newObject = _.map(yourObject, function(val) {
return {
    "value": val._id,
    "label": val.name
}});

И та же концепция для другого результата, который вас интересует.

1
Roni Axelrad 15 Дек 2015 в 16:31