Javascript 如何用map来转换数组,而不是forEach用零来完成缺少的序列?

Javascript 如何用map来转换数组,而不是forEach用零来完成缺少的序列?,javascript,arrays,foreach,ecmascript-6,Javascript,Arrays,Foreach,Ecmascript 6,我想转换一个数组或对象,用零来依次实现缺少的值。 例如,从输入:{Id0:9,Id1:1,Id3:1,Id5:6}到输出:[9,1,0,1,0,6] 我已使用forEach解决了以下代码的问题,但想知道是否有更好的解决方案使用map函数 var tasks = [ { "_id": 0, "count": 9 }, { "_id": 1, "count": 1 }, { "_id": 3, "count": 1 }, { "_id": 5, "count": 6 } ] var

我想转换一个数组或对象,用零来依次实现缺少的值。 例如,从
输入:{Id0:9,Id1:1,Id3:1,Id5:6}
输出:[9,1,0,1,0,6]

我已使用
forEach
解决了以下代码的问题,但想知道是否有更好的解决方案使用
map
函数

var tasks = [
  { "_id": 0, "count": 9 },
  { "_id": 1, "count": 1 },
  { "_id": 3, "count": 1 },
  { "_id": 5, "count": 6 }
]
var task_ids = [];
tasks.forEach(function (task) {
  if (task._id == task_ids.length) {
    task_ids.push(task.count);
  } else {
    for (var i = 0, max = (task._id-task_ids.length); i < max; i += 1) {
        task_ids.push(0);
    }
    task_ids.push(task.count);
  }
});

// Outputs: [9, 1, 0, 1, 0, 6]
console.log(task_ids);
var任务=[
{u id:0,“count:9},
{u id:1,“count:1},
{u id:3,“count:1},
{u id:5,“count:6}
]
var任务_id=[];
tasks.forEach(函数(任务){
if(task.\u id==task\u id.length){
任务ID.push(任务计数);
}否则{
对于(var i=0,max=(task.\u id-task\u id.length);i你不能(合理地)使用
map
<代码>映射
生成一个新数组,其条目数与原始数组相同
forEach
是这里的正确解决方案。(有些人可能使用
reduce
,不断地将数组作为“累加器”传递,但这是一个很大的问题,有时被认为是
reduce
的“滥用”[因为累加器的值永远不会改变,只是它的状态])

还有vervion,里面有
的循环:

var task_ids = tasks.reduce((acc, task) => {
  while(task._id !== acc.length) {
    acc.push(0);
  }
  acc.push(task.count);
  return acc;
}, []);

console.log(task_ids); // [9, 1, 0, 1, 0, 6]

reduce方法的主要优点是声明
任务\u id
数组不会与其填充分离。

我认为forEach是这里最干净的方法,我只需将代码简化一点,如下所示:

var tasks = [
    { "_id": 0, "count": 9 },
    { "_id": 1, "count": 1 },
    { "_id": 5, "count": 6 }
];

var task_names = [];
tasks.forEach(task => {
    while (task._id !== task_names.length) {
        task_names.push(0);
    }
    task_names.push(task.count);
});
console.log(task_names); // [9, 1, 0, 0, 0, 6]
你可以这样做

var obj={Id0:9,Id1:1,Id3:1,Id5:6},
稀疏=对象.keys(obj).reduce((s,k)=>(s[+k.replace(/[^\d]+/,“”)]=obj[k],s),[]);
密集=对象.assign(数组(稀疏.长度).fill(0),稀疏);

控制台日志(密集)此解决方案处理提供的初始样本,但不处理多个缺失序列,如
var tasks=[{{u id:0,“count:9},{u id:1,“count:1},{u id:5,“count:6}]
那么解决方案是
[9,1,0,6]
而不是
[9,1,0,0,6]
@piixiees:我明白了:在这种情况下,您需要将if语句替换为一段时间。我修正了我的答案。这涵盖了您描述的两种场景。
var tasks = [
    { "_id": 0, "count": 9 },
    { "_id": 1, "count": 1 },
    { "_id": 5, "count": 6 }
];

var task_names = [];
tasks.forEach(task => {
    while (task._id !== task_names.length) {
        task_names.push(0);
    }
    task_names.push(task.count);
});
console.log(task_names); // [9, 1, 0, 0, 0, 6]