Underscore.js - 将键/值对的数组映射到对象 - 一个班轮

时间:2013-07-23 05:32:17

标签: javascript underscore.js

我一直在浏览underscore docs,但我似乎找不到方法(或嵌套方法调用)来进行以下转换:

假设我有以下Javascript数组:

 [{ "name" : "sEcho", "value" : 1},{ "name" : "iColumns", "value" : 12}, ... ]

我需要将其转换为以下对象:

 {
      sEcho: 1,
      iColumns: 12,
      ...
 }

我使用underscore.js是有原因的,所以它必须是一个班轮。

8 个答案:

答案 0 :(得分:58)

Sza's answer的变体,使用_.object的“数组对”签名:

_.object(_.map(data, function(x){return [x.name, x.value]}))

答案 1 :(得分:52)

由于没有人将此作为答案发布,我发帖是因为我觉得它比Jan's answer好。没有内联功能,它更短,更清洁。

_.object(_.pluck(data, 'name'), _.pluck(data, 'value'));

答案 2 :(得分:27)

这应该这样做:

_.reduce(array, function(o, v){
    o[v.name] = v.value;
    return o;
}, {});

作为一个单行(你在开玩笑吧,对吗?):

_.reduce(array,function(a,b){a[b.name]=b.value;return a},{});

答案 3 :(得分:6)

假设您有以下JavaScript数组:

var list = [
    {
         name: "sEcho",
         value: 1
    },
    {
         name: "iColumns",
         value: 12
    },
    ...
];

您可以将其转换为您想要的格式,如下所示:

var table = _.reduce(list, function (table, item) {
    table[item.name] = item.value;
    return table;
}, {});

这不是一个班轮,但我不认为你的字面意思是一个班轮。你呢?

如果你真的想要一个班轮,那么这是一个班轮:

var t = _.reduce(list, function (t, i) { return t[i.name] = i.value, t; }, {});

是的,其他人提供了相同的答案。然而,这只是因为您的问题的答案非常简单。

答案 4 :(得分:6)

var names = _.pluck(data, 'name');
var values = _.pluck(data, 'value');
var result = _.object(_.zip(names, values));
console.log(result);

答案 5 :(得分:3)

var a =  [{ "name" : "sEcho", "value" : 1},{ "name" : "iColumns", "value" : 12} ];

var o = {}; _.each(a, function(e) { o[e.name] = e.value; });

console.log(o);
// Object {sEcho: 1, iColumns: 12} 

答案 6 :(得分:2)

完美的使用地点我认为:

_.reduce(ary, function(memo, obj){ memo[obj["name"]] = obj["value"]; return memo }, {});

答案 7 :(得分:0)

var arr = [{ "name" : "sEcho", "value" : 1},{ "name" : "iColumns", "value" : 12}]

ES6

_.mapObject( _.indexBy(arr, 'name'), (v) => v.value )

ES5

_.mapObject( _.indexBy(arr, 'name'), function (v) { return v.value; } )

这会迭代两次