在 CoffeeScript 中将对象数组映射到键/值对

Mapping an array of objects to key/value pairs in CoffeeScript

本文关键字:值对 映射 数组 CoffeeScript 对象      更新时间:2023-09-26

我有一个元素数组,我想应用映射将其转换为单个对象上的键值对(以模仿关联数组(。

解构赋值中的方法似乎对我不起作用,因为它会产生一个简单的数组而不是键/值对。

我选择的语言是CoffeeScript或JavaScript。

举个例子:

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

应该转换为:

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

首选单行。

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,但填充起来并不难。下面是一个示例填充程序:

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.reducearr.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
)
values = {}
values[name] = value for {name, value} in arr

或者在 JavaScript 中:

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

这几乎正是CoffeeScript编译的内容。

若要修复语法错误,必须{ @name: @value }展开为:

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

然后,您可以将对象与 $.extend() 和 splat 合并(使用空对象以避免意外扩展 jQuery(:

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

不过,更简单的选择是仅使用 2 行:

result = {}
$(row).children('input').each(() -> result[@name] = @value)

或者使用普通的 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);

Using 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;
}, {})

ES6 单行:

const data = [{name: 'a', value: 97}, {name: 'b', value: 98}]
data.reduce((obj, e) => ({...obj, [e.name]: e.value}), {})

看看 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));

这完全可以产生您想要的。