在 CoffeeScript 中将对象数组映射到键/值对
Mapping an array of objects to key/value pairs in CoffeeScript
我有一个元素数组,我想应用映射将其转换为单个对象上的键值对(以模仿关联数组(。
解构赋值中的方法似乎对我不起作用,因为它会产生一个简单的数组而不是键/值对。
我选择的语言是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.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
)
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));
这完全可以产生您想要的。
相关文章:
- 如何对映射插件创建的敲除对象进行深度复制
- 正在数组中存储键值对
- 数据表通过分析一列的值对其进行排序
- 如何将新的键/值对元素添加到现有数组
- 在键值对中对求和值进行下划线
- 比较包含多个值对的两个JavaScript数组
- 我想将查询字符串变量添加到JSON名称/值对中
- 返回由键/值对定义的数组
- 在url参数javascript中存储键值对列表
- 设置选项对象关键点:值对以实现带第二个y轴的动态打印
- 将数组转换为键值对
- jQueryAJAX-将额外的键/值对推送到序列化的$_POST数组中
- 从JavaScript中的名称-值对字符串中删除值
- 按值对映射/哈希进行排序,保留键
- Underscore.js-将键/值对的数组映射到Object-One行
- 将外部json查找中的值映射到数组中,作为新的键/值对
- 将键值对映射到javascript对象
- 在javascript中以列表形式从映射中生成值对
- 在 CoffeeScript 中将对象数组映射到键/值对
- 推键值对映射对象javascript