Отображение массива объектов в пары ключ / значение в CoffeeScript - PullRequest
29 голосов
/ 02 декабря 2011

У меня есть массив элементов, к которым я хотел бы применить отображение, чтобы преобразовать его в пары ключ-значение на одном объекте (для имитации ассоциативного массива).

Подход в МожетНазначение деструктурирования для создания проекции в CoffeeScript? , похоже, не работает для меня, поскольку в результате получается простой массив вместо пар ключ / значение.

Мой язык выбора - CoffeeScript или JavaScript.

Пример:

[{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}]

предполагается преобразовать в:

{
  a: 'b',
  d: 'e'
}

Предпочтительны однострочные.; -)

Ответы [ 7 ]

78 голосов
/ 02 декабря 2011
var arr = [{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}];

var obj = arr.reduce(function ( total, current ) {
    total[ current.name ] = current.value;
    return total;
}, {});

Чистый JavaScript.Это практически один вкладыш, и он выглядит как.

Array.prototype.reduce - это ES5, но его не трудно подобрать.Вот пример shim:

Array.prototype.reduce = function ( fun, initVal ) {
    var sum = initVal || this[ 0 ],
        i = 1, len = this.length;

    do {
        sum = fun.call( undefined, sum, this[i], i, this );
    } while ( ++i < len );

    return sum;
};

arr.reduce является сложной версией arr.map, которая является сложной версией arr.forEach.Вы можете сделать это для того же эффекта:

var obj = {};
arr.forEach(function ( val ) {
    obj[ val.name ] = val.value;
});

//and using jQuery.each
var obj = {};
$.each( arr, function ( index, val ) {
    obj[ val.name ] = val.value;
});

//latter version in coffeescript:
obj = {}
$.each( arr, (index, val) ->
    obj[ val.name ] = val.value
)
19 голосов
/ 02 декабря 2011
values = {}
values[name] = value for {name, value} in arr

или в javascript:

var values = {}
arr.forEach(function(o){
    values[o.name] = o.value
})

Это почти то же самое, что компилируется в CoffeeScript.

12 голосов
/ 02 декабря 2011

Чтобы исправить синтаксическую ошибку, вам нужно расширить { @name: @value } до:

o = {}; o[@name] = @value; o

Затем вы можете объединить объекты с помощью $.extend() и восклицательного знака (с пустым объектом, чтобы избежать случайного расширения jQuery):

$.extend {}, $(row).children('input').map(() -> o = {}; o[@name] = @value; o)...

Хотя, более простым вариантом было бы просто использовать 2-строчный:

result = {}
$(row).children('input').each(() -> result[@name] = @value)
8 голосов
/ 15 мая 2017

Или с использованием простого ES6:

const old = [
  {name: 'a', value: 'b', other: 'c'}, 
  {name: 'd', value: 'e', other: 'f'}
]

const transformed = Object.assign(
  {}, 
  ...old.map(({name, value}) => ({ [name]: value }))
);

console.log(transformed);
5 голосов
/ 07 марта 2016

Использование Array.prototype.reduce () :

var arrayOfObjects = [
              {name: 'a', value: 'b', other: 'c'}, 
              {name: 'd', value: 'e', other: 'f'}
            ];

arrayOfObjects.reduce(function(previousValue, currentValue, currentIndex) {
  previousValue[currentValue.name] = currentValue.value;
  return previousValue;
}, {})
1 голос
/ 14 апреля 2013

Посмотрите на http://coffeescriptcookbook.com/chapters/arrays/creating-a-dictionary-object-from-an-array

  myArray = [{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}]
  dict = {}
  dict[obj['name']] = obj['value'] for obj in myArray when obj['name']?
  console.log(JSON.stringify(dict, 0, 2));

Это производит именно то, что вы хотите.

0 голосов
/ 09 июля 2018

ES6 однострочный:

const data = [{name: 'a', value: 97}, {name: 'b', value: 98}]

data.reduce((obj, e) => ({...obj, [e.name]: e.value}), {})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...