如何从Javascript中的对象数组中区分和合并对象

时间:2020-03-09 04:46:50

标签: javascript arrays

我有一个对象数组。

[
  { _id: { year: 2020, month: 1 } },
  { _id: { year: 2019, month: 1 } },
  { _id: { year: 2019, month: 2 } },
  { _id: { year: 2019, month: 4 } },
  { _id: { year: 2019, month: 5 } },
  { _id: { year: 2019, month: 8 } },
  { _id: { year: 2019, month: 9 } },
  { _id: { year: 2019, month: 11 } }
]

我想从对象中删除重复的年份属性,并将不同的月份数据推送到一个数组对象中。

我想获得以下输出:

[
  {
    "_id": {
      "year": 2020,
      "month": [1]
    }
  },
  {
    "_id": {
      "year": 2019,
      "month": [1, 2, 4, 5, 8, 9, 11]
    }
  }
]

我已经尝试过,但无法获得预期的输出:

let arr = [
  { _id: { year: 2020, month: 1 } },
  { _id: { year: 2019, month: 1 } },
  { _id: { year: 2019, month: 2 } },
  { _id: { year: 2019, month: 4 } },
  { _id: { year: 2019, month: 5 } },
  { _id: { year: 2019, month: 8 } },
  { _id: { year: 2019, month: 9 } },
  { _id: { year: 2019, month: 11 } }
];

let newArr= []; 
    arr.forEach(function (item) { 
        let isMatch = newArr.filter(function (elem) {
            return elem._id.year === item._id.year 
        })
        if (isMatch.length == 0) {
            newArr.push(item)
        }
        else {
            newArr.find(x => x._id.year === item._id.year)._id.month.push(...item._id.month);
        }
    })
    console.log(newArr);

3 个答案:

答案 0 :(得分:1)

您可以尝试使用Array.reduce

X >= 0

答案 1 :(得分:0)

首先使对象按年份索引,其值是到目前为止该年找到的月份,并在每次迭代时推入该年份的数组(如有必要,创建)。然后,将数组的对象转换为您的输出结构:

<Grid.ColumnDefinitions>
        <ColumnDefinition Width="0.5*"/>
        <ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>

答案 2 :(得分:0)

您可以使用reduce和findIndex并检查累加器数组是否包含该年份,然后只需按下月份即可。

let data = [{
    _id: {
      year: 2020,
      month: 1
    }
  },
  {
    _id: {
      year: 2019,
      month: 1
    }
  },
  {
    _id: {
      year: 2019,
      month: 2
    }
  },
  {
    _id: {
      year: 2019,
      month: 4
    }
  },
  {
    _id: {
      year: 2019,
      month: 5
    }
  },
  {
    _id: {
      year: 2019,
      month: 8
    }
  },
  {
    _id: {
      year: 2019,
      month: 9
    }
  },
  {
    _id: {
      year: 2019,
      month: 11
    }
  }
]

let newData = data.reduce((acc, curr) => {
  let isYrPresent = acc.findIndex((item) => {
    return item._id.year === curr._id.year;
  });

  if (isYrPresent === -1) {
    acc.push({
      _id: {
        year: curr._id.year,
        month: [curr._id.month]
      }
    })
  } else {
    acc[isYrPresent]._id.month.push(curr._id.month)
  }


  return acc;
}, []);

console.log(newData)