Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Thuật toán hiệu quả để nhóm phần tử và đếm trùng lặp trong JavaScript


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

Muốn nhóm đối tượng theo thuộc tính này và lưu 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

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à đủ.

Cần hiển thị kết quả như:

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

Ví dụ

Mã thực hiện như sau:

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));

Kết quả

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