[英]Mapping an array of objects to key/value pairs in CoffeeScript
我有一個元素數組,我想應用一個映射來將其轉換為單個對象上的鍵值對(模仿一個關聯數組)。
Can destructuring assign中的方法可用於在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(使用空對象$.extend()
合並對象以避免意外擴展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);
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;
}, {})
看看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));
這產生了你想要的。
ES6單線:
const data = [{name: 'a', value: 97}, {name: 'b', value: 98}]
data.reduce((obj, e) => ({...obj, [e.name]: e.value}), {})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.