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

par*_*ent 46 javascript underscore.js

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

假设我有以下Javascript数组:

 [{ "name" : "sEcho", "value" : 1},{ "name" : "iColumns", "value" : 12}, ... ]
Run Code Online (Sandbox Code Playgroud)

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

 {
      sEcho: 1,
      iColumns: 12,
      ...
 }
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*rak 58

Sza答案的变化,使用"对数组"签名_.object:

_.object(_.map(data, function(x){return [x.name, x.value]}))
Run Code Online (Sandbox Code Playgroud)

  • 此外,Sza的示例将在没有zip的情况下工作(因为对象采用单个数组的名称/ val对或两个不同的数组).所以你可以做`_.object(_pluck(data,'name'),_.droplu(data,'value'))` (3认同)
  • 太好了!如果你正在使用typescript,甚至可以节省一些击键;)`_.object(_.map(data,(x)=> {return [x.name,x.value]})) (2认同)
  • 说到其他语言,最清楚的可能是在CS中使用理解:`_.object([o.name,o.value] for o in data) (2认同)

Bra*_*her 52

由于没有人发布这个作为答案,我发布它是因为我认为它比Jan的答案更好.没有内联功能,它更短,更清洁.

_.object(_.pluck(data, 'name'), _.pluck(data, 'value'));
Run Code Online (Sandbox Code Playgroud)

  • AFAICS下划线没有明确保证`pluck`和`map`结果的任何顺序,所以即使这在当前浏览器中有效,我也不会依赖它.想象一下,追踪将值分配给错误键的错误是多么困难. (2认同)

Esa*_*ija 27

这应该这样做:

_.reduce(array, function(o, v){
    o[v.name] = v.value;
    return o;
}, {});
Run Code Online (Sandbox Code Playgroud)

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

_.reduce(array,function(a,b){a[b.name]=b.value;return a},{});
Run Code Online (Sandbox Code Playgroud)

  • 我没有看到要求任何总结.如果他们试图聪明地使用单行(可能还有其他什么原因?)那么你可能会对你对维护者的仇恨以及引入逗号运算符的公然谴责:`_(a).reduce (function(m,h){return m [h.name] = h.value,m},{})`.嘿. (5认同)

Aad*_*hah 6

假设您有以下JavaScript数组:

var list = [
    {
         name: "sEcho",
         value: 1
    },
    {
         name: "iColumns",
         value: 12
    },
    ...
];
Run Code Online (Sandbox Code Playgroud)

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

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

它不是一个单行,但我不认为你的字面意思是单行.你是否?

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

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

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


zs2*_*020 6

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

  • +1虽然有趣的是要注意,需要3个不太知名的,专门的方法来执行相同数量的代码,使用1个相对众所周知的方法(reduce). (2认同)