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

Javascript 将对象数组映射到CoffeeScript中的键/值对,javascript,jquery,coffeescript,Javascript,Jquery,Coffeescript,我有一个元素数组,我想应用映射将其转换为单个对象上的键值对(模拟关联数组) 中的方法似乎对我不起作用,因为它会生成一个简单的数组,而不是键/值对 我选择的语言是CoffeeScript或JavaScript 例如: [{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}] 应转化为: { a: 'b', d: 'e' } 最好使用一个衬里。;-) 要修复语法错误,您必须将{@name:@val

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

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

我选择的语言是CoffeeScript或JavaScript

例如:

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

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

最好使用一个衬里。;-)

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

o = {}; o[@name] = @value; o
然后可以将对象与
$.extend()
和splat(与空对象合并以避免意外扩展jQuery)合并:

不过,更简单的选择是只使用2-liner:

result = {}
$(row).children('input').each(() -> result[@name] = @value)
纯javascript。这实际上是一条单行线,看起来很粗

是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;
};
或在javascript中:

var values = {}
arr.forEach(function(o){
    values[o.name] = o.value
})
这几乎正是我们要编译的咖啡脚本。

看一看

这会产生您想要的结果。

使用:

或者使用普通ES6:

const old=[
{名称:'a',值:'b',其他:'c'},
{name:'d',value:'e',other:'f'}
]
const transformed=Object.assign(
{}, 
…old.map(({name,value})=>({[name]:value}))
);
console.log(已转换)ES6一个衬里:

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

data.reduce((obj, e) => ({...obj, [e.name]: e.value}), {})

建议您使用纯coffeescript制作一个没有jquery依赖项的示例;可以自己测试的东西。如果你不明白,也许我们其他人可以。马吕斯·克耶达尔:好了。希望这更清楚一点,“最好是一行”?真的吗行数!==马特·麦克唐纳:同意。不过,如果有明确的一行代码,我倾向于使用该行代码,而不是多语句解决方案。IMHO,reduce方法是合格的(尽管它需要一个实用的方法)。tokland:还没有,但我不会排除它。你确定I的初始化是正确的吗?如果有一个initVal且只有一个数组元素,则永远不会调用fun。@Zirak这很好obj=arr.reduce((o,item)->o[item.name]=item.value;o),{}
。@Thilo AlexanderGinkel这是一个非常可靠的垫片集合:@Thilo AlexanderGinkel很好的捕捉。修复并添加了替代方案。有些旧,但您可以将js版本简化为
arr.reduce(函数(total,current){return total[current.name]=current.value,total},{})
,如果确实必须,您可以将初始化放入回调(result?={})[@name]…这是一个热门的单行程序-但你能解释一下这部分吗?old.map(({name,value})=>({[name]:value}))这个=>()在做什么?它返回一个带有变量名的键值对,但我没有得到()或[]部分。它返回一个带有变量键的键值对,始终是
名称
值,值是旧对象的
值。因此,它返回
{a:'b'}
,将分配给空对象。明白吗?我花了很多时间寻找我现在理解的所谓的计算属性名(
{[key]:value}
),这个答案就是我最终需要知道要搜索什么的线索。非常感谢。
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
var values = {}
arr.forEach(function(o){
    values[o.name] = o.value
})
  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));
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;
}, {})
const data = [{name: 'a', value: 97}, {name: 'b', value: 98}]

data.reduce((obj, e) => ({...obj, [e.name]: e.value}), {})