我一直在查看underscore文档,但似乎找不到一个方法(或嵌套的方法调用)来完成以下转换:
假设我有以下Javascript数组:
[{ "name" : "sEcho", "value" : 1},{ "name" : "iColumns", "value" : 12}, ... ]
我需要将它转换为以下对象:
{
sEcho: 1,
iColumns: 12,
...
}
我使用underscore.js是有原因的,所以它必须是一行代码。
我一直在查看underscore文档,但似乎找不到一个方法(或嵌套的方法调用)来完成以下转换:
假设我有以下Javascript数组:
[{ "name" : "sEcho", "value" : 1},{ "name" : "iColumns", "value" : 12}, ... ]
我需要将它转换为以下对象:
{
sEcho: 1,
iColumns: 12,
...
}
我使用underscore.js是有原因的,所以它必须是一行代码。
使用_.object
的“数组对”签名对Sza的答案进行变化:
_.object(_.map(data, function(x){return [x.name, x.value]}))
_.object(_.map(data, (x) => {return [x.name, x.value]}))
- parliament_.object(_pluck(data,'name'), _.pluck(data,'value'))
。 - ShawnFumo_.object([o.name, o.value] for o in data)
。 - ShawnFumo_.chain
函数可能会更清晰:https://gist.github.com/ablanchet/f8b9c3ece0812ebf3f3c - Antoine Blanchet因为没有人把这个作为答案发布,所以我发布了它,因为我认为它比 Jan的答案 更好。它更短,没有内联函数,更加简洁。
_.object(_.pluck(data, 'name'), _.pluck(data, 'value'));
pluck
和map
的结果顺序,因此即使这在当前浏览器中可行,我也不会依赖它。试想一下跟踪错误并找到值分配给错误键的bug将是多么困难。 - peterp{sEcho:12,iColumns:1}
而不是预期结果。这就是为什么我更喜欢在单个操作中执行键值映射,例如reduce
或map
。 - peterppluck
、map
和object
函数都是在数组上操作的,其中顺序是有保证的,所以没有问题。 - Brad Pitcher_.reduce(array, function(o, v){
o[v.name] = v.value;
return o;
}, {});
作为一行代码(你在开玩笑吧,对吧?):_.reduce(array,function(a,b){a[b.name]=b.value;return a},{});
b.value
的值求和?为什么不直接使用 a[b.name] = b.value
呢? - mu is too short_(a).reduce(function(m, h) { return m[h.name] = h.value, m }, { })
。嘿。 - mu is too shortvar names = _.pluck(data, 'name');
var values = _.pluck(data, 'value');
var result = _.object(_.zip(names, values));
console.log(result);
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; }, {});
是的,其他人已经提供了相同的答案。但这只是因为你的问题的答案非常简单。
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}
我认为使用reduce是非常完美的选择:
_.reduce(ary, function(memo, obj){ memo[obj["name"]] = obj["value"]; return memo }, {});
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; } )
这个会迭代两次
<script type="text/javascript">
var obj = {
Company: "GeeksforGeeks",
Address: "Noida",
Contact: "+91 9876543210",
Email: "abc@gfg.com"
}
console.log(_.keys(obj));
</script>
来源:https://www.geeksforgeeks.org/underscore-js-_-keys-function/
_.map(arr,function(v,o){o={};return o[v.name]=v.value,o });
不确定是否有更短的方法... - elclanrs