根据序列中的相同值过滤JS数组

时间:2020-10-06 17:23:09

标签: javascript filter iteration

我有一个像这样的数组。

const cars = [
  {year: "2003", made: "BMW"},
  {year: "2004", made: "Honda"},
  {year: "2005", made: "BMW"},
  {year: "2006", made: "BMW"},
  {year: "2006", made: "Mercedes"},
  {year: "2007", made: "BMW"},
  {year: "2008", made: "Mercedes"},
  {year: "2009", made: "Mercedes"},
];

预期输出:

const output = [
  [
    {year: "2003", made: "BMW"},
  ],
  [
    {year: "2004", made: "Honda"},
  ],
  [
    {year: "2005", made: "BMW"},
    {year: "2006", made: "BMW"},
  ],
  [
    {year: "2006", made: "Mercedes"},
  ],
  [
    {year: "2007", made: "BMW"},
  ].
  [
    {year: "2008", made: "Mercedes"},
    {year: "2009", made: "Mercedes"},
  ],
];

我希望以上代码段中的要求已经明确。主要思想是根据键的匹配值从现有数据创建数组对象或多维数组。在上面的示例中,made键被过滤。

1 个答案:

答案 0 :(得分:0)

使用reduce并检查先前制作的内容是否等于当前制作的内容,然后将其添加到相同的索引中,否则将其压入结果

const cars = [
    {year: '2003', made: 'BMW'},
    {year: '2004', made: 'Honda'},
    {year: '2005', made: 'BMW'},
    {year: '2006', made: 'BMW'},
    {year: '2006', made: 'Mercedes'},
    {year: '2007', made: 'BMW'},
    {year: '2008', made: 'Mercedes'},
    {year: '2009', made: 'Mercedes'},
];


let carsResult = [];
cars.reduce((prev, curr) => {
  if (curr.made != prev.made) {
    carsResult.push([curr])
  } else {
    carsResult[carsResult.length - 1].push(curr)
  }
  return curr
}, {})
console.log(carsResult)