Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

อัลกอริทึมมีประสิทธิภาพสำหรับจัดกลุ่มสมาชิกและนับค่าซ้ำใน JavaScript

เรามีอาร์เรย์ของอ็อบเจ็กต์ หากคุณสมบัติหนึ่งของอ็อบเจ็กต์เหมือนกับอ็อบเจ็กต์อื่น เราถือว่าเป็นรายการซ้ำ เราต้องการจัดกลุ่มอ็อบเจ็กต์ตามคุณสมบัตินี้และเก็บข้อมูลว่ามี "ซ้ำ" กี่ครั้ง

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

เราต้องการจัดกลุ่มตามค่าแรก อีกสองคุณสมบัติเหมือนกันในแต่ละรายการซ้ำ แต่การเปรียบเทียบค่าแรกเพียงอย่างเดียวก็เพียงพอ

เราต้องการแสดงผลให้ผู้ใช้เห็นแบบนี้:

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

ตัวอย่างโค้ด

โค้ดสำหรับทำสิ่งนี้คือ:

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

ผลลัพธ์

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