45

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

假设我有以下 Javascript 数组:

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

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

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

我使用 underscore.js 是有原因的,所以它必须是单行的。

4

8 回答 8

59

Sza 的答案的变体,使用“对数组”签名_.object

_.object(_.map(data, function(x){return [x.name, x.value]}))
于 2013-07-23T05:59:23.260 回答
52

由于没有人将此作为答案发布,因此我发布它是因为我认为它比Jan 的答案更好。没有内联函数,它更短、更干净。

_.object(_.pluck(data, 'name'), _.pluck(data, 'value'));
于 2015-02-18T18:38:41.410 回答
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},{});
于 2013-07-23T05:38:57.403 回答
7
var names = _.pluck(data, 'name');
var values = _.pluck(data, 'value');
var result = _.object(_.zip(names, values));
console.log(result);
于 2013-07-23T05:47:31.020 回答
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; }, {});

是的,其他人也提供了相同的答案。然而,这仅仅是因为你的问题的答案是如此简单。

于 2013-07-23T05:41:34.700 回答
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} 
于 2013-07-23T05:39:00.333 回答
2

我认为使用 reduce 的完美场所:

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

于 2013-07-23T06:06:16.787 回答
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; } )

虽然这会迭代两次

于 2016-08-22T02:44:02.117 回答