Saya mencoba mengelompokkan objek yang memiliki properti yang sama. Saya mulai dengan array objek, dan saya ingin mengakhiri dengan array yang berisi beberapa array masing-masing dengan objek yang memiliki properti yang sama.

Katakanlah saya memiliki larik objek film ini, semuanya memiliki properti satu tahun, dan saya ingin mengelompokkan semua film dengan properti tahun yang sama dalam lariknya sendiri dan akhirnya memiliki semua larik itu dalam satu larik.

// This is the array I've got
const films = [
  {
    name='film 1',
    year='1992'
  },
  {
    name='film 2',
    year='1992'
  },
  {
    name='film 3',
    year='1995'
  },
  {
    name='film 4',
    year='1995'
  },
  {
    name='film 5',
    year='1995'
  },
  {
    name='film 6',
    year='1998'
  },
  {
    name='film 7',
    year='1998'
  },
]

// And this is the array I want to end up with
const filmsSorted = [
  [
    {
      name='film 1',
      year='1992'
    },
    {
      name='film 2',
      year='1992'
    },
  ]
  [
    {
      name='film 3',
      year='1995'
    },
    {
      name='film 4',
      year='1995'
    },
    {
      name='film 5',
      year='1995'
    },
  ]
  [
    {
      name='film 6',
      year='1998'
    },
    {
      name='film 7',
      year='1998'
    },
  ]
]

Ingatlah bahwa saya tidak memiliki properti year sebelumnya dan harus berurusan secara dinamis dengan tahun berapa pun yang saya terima dalam larik asli.

Meskipun ada banyak pertanyaan tentang pengurutan dan pemfilteran array di sini, saya tidak dapat menemukan jawaban untuk masalah khusus ini. Saya mencoba menggunakan reduce() dan filter() dan kombinasinya, tetapi sepertinya saya tidak bisa memahaminya. Saya telah menemukan beberapa solusi yang mungkin (mengubahnya menjadi objek dan kembali ke array) tetapi yang benar-benar saya inginkan adalah melihat beberapa cara berbeda agar ini dapat diselesaikan untuk membantu saya menjelaskannya dengan lebih baik.

0
Syknapse 27 Oktober 2019, 13:34

3 jawaban

Jawaban Terbaik

Ambil saja tabel hash dan kelompokkan dengan year dan ambil nilainya dari tabel hash.

Bonus: Hasil yang diurutkan, karena kunci objek diurutkan, jika kunci dapat dibaca sebagai indeks array.

var films = [{ name: 'film 1', year: '1992' }, { name: 'film 2', year: '1992' }, { name: 'film 3', year: '1995' }, { name: 'film 4', year: '1995' }, { name: 'film 5', year: '1995' }, { name: 'film 6', year: '1998' }, { name: 'film 7', year: '1998' }],
    grouped = Object.values(
        films.reduce((r, o) => {
            (r[o.year] = r[o.year] || []).push(o);
            return r;
        }, {})
    );

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2
Nina Scholz 27 Oktober 2019, 10:49

Saya telah menemukan cara lain untuk melakukan ini, saya akan meninggalkannya di sini jika itu berguna bagi pembaca di masa mendatang.

const films = [{ name: 'film 1', year: '1992' }, { name: 'film 2', year: '1992' }, { name: 'film 3', year: '1995' }, { name: 'film 4', year: '1995' }, { name: 'film 5', year: '1995' }, { name: 'film 6', year: '1998' }, { name: 'film 7', year: '1998' }]
let filmsSorted = []
let years = {}

films.forEach(film => {
    if (!years[film.year]) years[film.year] = []
    years[film.year].push(film)
})

filmsSorted = Object.values(years)

Ini menciptakan objek sementara, yang memiliki pasangan kunci/nilai dari properti umum (tahun) dan larik dari semua objek yang berisi properti ini. Kemudian kita cukup membuat array nilai dan kita berakhir dengan penyortiran yang diperlukan.

0
Syknapse 4 November 2019, 10:16

Coba ini:

const films = [
  {
    name: 'film 1',
    year: '1992'
  },
  {
    name: 'film 2',
    year: '1992'
  },
  {
    name: 'film 3',
    year: '1995'
  },
  {
    name: 'film 4',
    year: '1995'
  },
  {
    name: 'film 5',
    year: '1995'
  },
  {
    name: 'film 6',
    year: '1998'
  },
  {
    name: 'film 7',
    year: '1998'
  }
]

const result = films.reduce((acc, curr) => {
  if (acc.some(e => e[0].year === curr.year)) acc.filter(e => e[0].year === curr.year)[0].push(curr)
  else acc.push([curr])
  
  return acc
}, [])

console.log(result)
1
cherryblossom 27 Oktober 2019, 10:52