Javascript 将对象数组映射到CoffeeScript中的键/值对
我有一个元素数组,我想应用映射将其转换为单个对象上的键值对(模拟关联数组) 中的方法似乎对我不起作用,因为它会生成一个简单的数组,而不是键/值对 我选择的语言是CoffeeScript或JavaScript 例如: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
[{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}), {})