Computer >> Máy Tính >  >> Lập trình >> Javascript

Thuật toán hiệu quả để nhóm các phần tử và đếm các bản sao trong JavaScript

Chúng ta có một mảng các đối tượng. Nếu một thuộc tính của đối tượng này giống với trong một đối tượng khác, chúng tôi coi đó là một mục nhập trùng lặp.

Chúng tôi muốn nhóm các đối tượng theo thuộc tính này và lưu trữ thông tin về số lần "trùng lặp" đã xảy ra.

   X A B O
   Y X Z I
   Y X Z U
   X A B L
   Y X Z K

Chúng tôi muốn nhóm theo giá trị đầu tiên.

Hai thuộc tính khác cũng giống nhau trong mỗi bản sao, nhưng so sánh giá trị đầu tiên là đủ.

Chúng tôi cần hiển thị cho người dùng một kết quả giống như -

   Y X Z (3)
   X A B (2)

Ví dụ

Mã cho điều này sẽ là -

const arr = [
   {x: 'x', acc: 'acc', val: 'val'},
   {y: 'y', x: 'x', z: 'z'},
   {y: 'y', x: 'x', z: 'z'},
   {x: 'x', c: 'c', val: 'val'}
];
const countOccurrence = (arr = []) => {
   const res = {};
   arr.forEach (item => {
      Object.keys( item ).forEach (prop => {
         ( res[prop] ) ? res[prop] += 1 : res[prop] = 1;
      });
   });
   return res;
}
const groupByOccurrence = (data = []) => {
   const obj = countOccurrence(data);
   const res = Object.keys ( obj ).reduce ( ( acc, val ) => {
      ( acc[obj[val]] ) ? acc[obj[val]].push ( val ) : acc[obj[val]] = [val];
      return acc;
   }, {});
   return res;
}
console.log(groupByOccurrence(arr));

Đầu ra

And the output in the console will be:
{ '1': [ 'acc', 'c' ], '2': [ 'val', 'y', 'z' ], '4': [ 'x' ] }