[英]How to transpose object in underscorejs
在JavaScript中我試圖轉換具有類似鍵的對象數組:
[{'a':1,'b':2}, {'a':3,'b':4}, {'a':5,'b':6,'c':7}]
到具有每個鍵的值數組的對象:
{'a':[1,3,5], 'b':[2,4,6], 'c':[7]};
使用underscore.js 1.4.2。
我在下面有一些工作代碼,但它比僅僅編寫嵌套for循環感覺更長更笨拙。
在下划線中有更優雅的方式嗎? 我有什么簡單的東西嗎?
console.clear();
var input = [{'a':1,'b':2},{'a':3,'b':4},{'a':5,'b':6,'c':7}];
var expected = {'a':[1,3,5], 'b':[2,4,6], 'c':[7]};
// Ok, go
var output = _(input)
.chain()
// Get all object keys
.reduce(function(memo, obj) {
return memo.concat(_.keys(obj));
}, [])
// Get distinct object keys
.uniq()
// Get object key, values
.map(function(key) {
// Combine key value variables to an object
// ([key],[[value,value]]) -> {key: [value,value]}
return _.object(key,[
_(input)
.chain()
// Get this key's values
.pluck(key)
// Filter out undefined
.compact()
.value()
]);
})
// Flatten array of objects to a single object
// [{key1: [value]}, {key2, [values]}] -> {key1: [values], key2: [values]}
.reduce(function(memo, obj) {
return _.extend(memo, obj);
}, {})
.value();
console.log(output);
console.log(expected);
console.log(_.isEqual(output, expected));
謝謝
聽起來你想要zip
對象。 這將是對象的類似方法:
_.transpose = function(array) {
var keys = _.union.apply(_, _.map(array, _.keys)),
result = {};
for (var i=0, l=keys.length; i<l; i++) {
var key = keys[i];
result[key] = _.pluck(array, key);
}
return result;
};
但是,我會用
_.transpose = function(array) {
var result = {};
for (var i=0, l=array.length; i<l)
for (var prop in array[i])
if (prop in result)
result[prop].push(array[i][prop]);
else
result[prop] = [ array[i][prop] ];
return result;
};
沒有任何Underscore :-)當然,你可以使用一些迭代器方法,然后它可能看起來像
_.reduce(array, function(map, obj) {
return _.reduce(obj, function(map, val, key) {
if (key in map)
map[key].push(val)
else
map[key] = [val];
return map;
}, map);
}, {});
你可以使用lodash的zipObject mehtod: https ://lodash.com/docs#zipObject
你需要3行lodash:
_.merge.apply(null, _.union([{}], myArrayOfObjects, [function (a, b) {
return _.compact(_.flatten([a, b]));
}]))
有關函數功能的更多詳細信息,請參閱_.merge
的文檔 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.