Javascript数组操作 - 是否有更多的声明式方法?

时间:2016-09-07 06:36:51

标签: javascript arrays object

谢谢你看看这里。我正在使用API​​,需要更改数据的格式。以下是返回数据的示例:

data: [
  { 
    status: "planned work",
    name: "123"
  },
  {
    status: "all good",
    name: "nqr"
  }
];

每条火车线的名称都是“123”或“nqr”,我想将每列火车分成他们自己的物品,这样看起来像这样:

data: [
  { 
    status: "planned work",
    name: "1"
  },
  { 
    status: "planned work",
    name: "2"
  },
  { 
    status: "planned work",
    name: "3"
  },
  {
    status: "all good",
    name: "n"
  },
  {
    status: "all good",
    name: "q"
  },
  {
    status: "all good",
    name: "r"
  }
];

我有一些工作代码,它们拆分名称并使用嵌套的.forEach循环将项目推送到数组。工作代码:

function formatLinesData(lines) {
  var trains = [];
  lines.forEach( line => {
    line.name.split("").forEach(train => {
      trains.push({name: train, status: line.status});
    });
  });
  return trains;
}

有没有办法在没有嵌套循环的情况下实现这一目标?寻找一个优雅的解决方案,如果你有一个。

由于

2 个答案:

答案 0 :(得分:2)

您可以使用reduce - 使用空数组初始化它,并迭代数据 数组使用你的逻辑。

data.reduce((prev,curr) => {
    for (let i=0; i<curr.name.length; i++) {
        prev.push({ name : curr.name[i], status : curr.status});
    }
    return prev;
},[]);

答案 1 :(得分:2)

您可以执行以下操作;

var data =  [
  { 
    status: "planned work",
    name: "123"
  },
  {
    status: "all good",
    name: "nqr"
  }
],

newData = [].concat(...data.map(o => o.name.split("").map(c => ({status: o.status, name: c}))));
console.log(newData);