在每张专辑中的每张专辑中找到第一张照片



我需要找到每张专辑的第一张照片。该照片在一个阵列中列出,其中包括每张照片上的专用ID:

[ { ID:1, 专利录:1, },, { id:2, 专利录:1, },, { id:3, 专利录:2, },, { id:4, 专利录:2, }]

因此,每个对象都是一张照片,它连接在专辑中。我想做的是在此数组上迭代并创建一个新数组,该阵列仅包括每张专辑中的第一张照片,假设原始数组已井井有条(因此,首次出现新的专辑ID,您可以假设这是第一个专辑中的照片(。

当前这是我拥有的代码:

let lastAlbumId = null;
const newAlbumArray = [];
albums.forEach(photo => {
  if (lastAlbumId === null) {
    lastAlbumId = photo.albumId;
    newAlbumArray.push(photo);
  } else if (lastAlbumId !== photo.albumId) {
    lastAlbumId = photo.albumId;
    newAlbumArray.push(photo);
  }
});
return newAlbumArray;

此代码有效,但是我觉得必须有一种更干净的方法来使用filter((或find((,任何建议?

您可以将Array.filter()与集合一起跟踪已添加的相册:

const photos = [{ id: 1, albumId: 1, }, { id: 2, albumId: 1, }, { id: 3, albumId: 2, }, { id: 4, albumId: 2, } ]
const albums = new Set();
const result = photos.filter(o => !albums.has(o.albumId) && albums.add(o.albumId))
console.log(result)

另一个选项是将数组使用albumId作为键将数组减少到地图。只有当专辑的ID尚未存在时,才可以将照片添加到地图中。完成后,我们通过扩散地图的值迭代器来将地图转换为数组:

const photos = [{ id: 1, albumId: 1, }, { id: 2, albumId: 1, }, { id: 3, albumId: 2, }, { id: 4, albumId: 2, } ]
const result = [...photos.reduce((m, o) => m.has(o.albumId) ? m :  m.set(o.albumId, o), new Map).values()]
console.log(result)

使用reduce

const albums = [ { id: 1, albumId: 1, }, { id: 2, albumId: 1, }, { id: 3, albumId: 2, }, { id: 4, albumId: 2, } ];
const output = Object.values(albums.reduce((accu, {id, albumId}) => {
    if(!accu[albumId]) accu[albumId] = {id, albumId};
    return accu;
}, {}));
console.log(output);

最新更新