Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript下划线数组到对象_Javascript_Arrays_Object_Underscore.js - Fatal编程技术网

Javascript下划线数组到对象

Javascript下划线数组到对象,javascript,arrays,object,underscore.js,Javascript,Arrays,Object,Underscore.js,是否有一种简单/干净的方式使用下划线来转换此选项 [ { id: 'medium', votes: 7 }, { id: 'low', votes: 9 }, { id: 'high', votes: 5 } ] 进入 你可以这样做,就像这样 console.log(_.object(_.map(data, _.values))); # { medium: 7, low: 9, high: 5 } 解释 我们使用映射函数将值函数(获取给定对象的所有值)应用于数据的所有元素,

是否有一种简单/干净的方式使用下划线来转换此选项

[ { id: 'medium', votes: 7 },
  { id: 'low',    votes: 9 },
  { id: 'high',   votes: 5 } ]
进入

你可以这样做,就像这样

console.log(_.object(_.map(data, _.values)));
# { medium: 7, low: 9, high: 5 }
解释

我们使用
映射
函数将
函数(获取给定对象的所有值)应用于
数据
的所有元素,这将

# [ [ 'medium', 7 ], [ 'low', 9 ], [ 'high', 5 ] ]

然后我们使用
object
函数将其转换为一个对象。

以下是vanilla js:

var result = {};
[ { id: 'medium', votes: 7 },
  { id: 'low',    votes: 9 },
  { id: 'high',   votes: 5 } ].forEach(function(obj) {
    result[obj.id] = obj.votes;
});
console.log(result);

对我来说更简单:
每个

   var t = {};
   _.each(x, function(e){
     t[e.id] = e.votes;
   });
//--> {medium: 7, low: 9, high: 5}

你可以考虑{索引xBy(…)< /P> 这是一把小提琴:

更新:在Lodash 4.0.1中,方法.indexBy已重命名为.keyBy

使用indexBy

_.indexBy([ 
   { id: 'medium', votes: 7 },
   { id: 'low',    votes: 9 },
   { id: 'high',   votes: 5 } 
 ], 'id');

下划线最强大的方法是reduce。你几乎可以用它做任何事。更大的好处是您只需在集合上迭代一次

var array = [ 
    { id: 'medium', votes: 7 },
    { id: 'low',    votes: 9 },
    { id: 'high',   votes: 5 } 
];
var object = _.reduce(array, function(_object, item) { 
    _object[item.id] = item.votes; 
    return _object; 
}, {});
运行后,对象将:

{
  medium:7,
  low:9,
  high:5
}

我知道这是一篇老文章,但你可以使用
\u0.reduce
以干净的方式进行转换

var data = [
    { id: 'medium', votes: 7 },
    { id: 'low',    votes: 9 },
    { id: 'high',   votes: 5 }
]

var output = _.reduce(data, function(memo, entry) {
    memo[entry.id] = entry.votes;
    return memo;
}, {});

console.log(output);

您可以使用本机JS Array.reduce实现这一点

const myArray = [ { id: 'medium', votes: 7 },
{ id: 'low',    votes: 9 },
{ id: 'high',   votes: 5 } ]

const myObject = myArray.reduce((obj, item)=>{
  o[item.id] = item.votes
  return o
}, {})

有关更多详细信息,请查看一个有趣的答案,但也许您可以首先澄清什么是数据,例如data=x;我用了Krasimir的答案,但你用下划线回答了问题,对这类问题感兴趣的人还有很多东西要学。@dewd请检查
数据的定义。有一条新线。我现在刚刚删除了它。您如何确保u0.values({id:'medium',votes:7})返回['medium',7],而不是[7,'medium']?此解决方案不可靠,依赖于对象中属性的顺序+1以确保可读性。值得注意的是,
id
属性仍将出现在结果对象中,但在大多数情况下这应该是可以的(在其他情况下很容易进行后期排除)。对于那些希望将最终对象中的每个键作为具有该键的项的数组(与单个项相反)的人来说,类似的解决方案还有
.groupBy()
在JavaScript中向对象动态添加新属性是一种反模式。知道了!也就是说@morio,你建议的解决方案是什么?嗯,你明白了。现在我想了想,我不知道是否有办法避免这种情况。我猜像Lodash这样的图书馆在内部也在做同样的事情。
{
  medium:7,
  low:9,
  high:5
}
var data = [
    { id: 'medium', votes: 7 },
    { id: 'low',    votes: 9 },
    { id: 'high',   votes: 5 }
]

var output = _.reduce(data, function(memo, entry) {
    memo[entry.id] = entry.votes;
    return memo;
}, {});

console.log(output);
const myArray = [ { id: 'medium', votes: 7 },
{ id: 'low',    votes: 9 },
{ id: 'high',   votes: 5 } ]

const myObject = myArray.reduce((obj, item)=>{
  o[item.id] = item.votes
  return o
}, {})