Array dengan objek:

var myArr = [ { user: 'jane', properties: ['prop1', 'prop2'] }
              { user: 'bob', properties: ['prop1', 'prop4'] }
              { user: 'dave', properties: ['prop1', 'prop2', 'prop3'] }
              { user: 'tim', properties: ['prop4', 'prop2', 'prop3'] } 
];

Apakah ada cara dalam javascript murni atau mungkin menggunakan lodash untuk mendapatkan pengguna yang memiliki setidaknya satu properti yang sama? Output harus menunjukkan pengguna mana yang cocok dengan pengguna mana, tanpa duplikat.

Saya sudah mencoba beberapa hal, tetapi sayangnya tidak bisa mendapatkan output yang diinginkan.

1
Erwin Lengkeek 28 Oktober 2019, 08:14

2 jawaban

Jawaban Terbaik

Solusi di bawah ini menggunakan Set untuk menentukan apakah ada properti yang cocok, dikombinasikan dengan operasi reduce() untuk menghasilkan pasangan pengguna yang cocok:

const array = [{ user: 'jane', properties: ['prop1', 'prop2'] },
  { user: 'bob', properties: ['prop1', 'prop4'] },
  { user: 'dave', properties: ['prop1', 'prop2', 'prop3'] },
  { user: 'tim', properties: ['prop4', 'prop2', 'prop3'] }];
  
const result = array.reduce((acc, val1, i, arr) => [
  ...acc,
  ...arr.slice(i + 1).filter(val2 => {
    const properties = [...val1.properties, ...val2.properties];
    return new Set(properties).size < properties.length;
  }).map(val2 => [val1.user, val2.user])
], []);

console.log(result);
3
Robby Cornelissen 28 Oktober 2019, 05:38

Anda dapat menggunakan Peta dan Objek, menghitung kemunculan pengguna untuk setiap properti, jika sama dengan panjang array maka setidaknya ada satu properti yang terjadi di semua pengguna

let matcher = (arr) => {
  let mapper = {}
  arr.forEach(v => {
  let { user, properties } = v
    properties.forEach(v => {
      if (mapper[v]) {
        mapper[v].set(user, (mapper[v].get(user) || 0) + 1)
      } else {
        mapper[v] = new Map()
        mapper[v].set(user, 1)
      }
    })
  })
  return Object.entries(mapper).some(([_, v]) => {
    let total = [...v].reduce((a, [_, b]) => a + b, 0)
    return total === arr.length
  })
}

let arr = [{user: 'jane',properties: ['prop1', 'prop2']}, {user: 'bob',properties: ['prop1', 'prop4']}, {user: 'dave',properties: ['prop1', 'prop2', 'prop3']}, {user: 'tim',properties: ['prop4', 'prop2', 'prop3']}];

console.log(matcher(arr))

let arr2 = [{user: 'jane',properties: ['prop1', 'prop2']},{user: 'bob',properties: ['prop1', 'prop4']}]

console.log(matcher(arr2))
0
Code Maniac 28 Oktober 2019, 05:43