Memasukkan

const products = {
      100: ['abc', 'xyz', 'mno', 'pqr'],
      200: ['mno', 'pqr'],
      300: ['abc', 'xyz'],
      400: ['abc', 'pqr'],
    }

Diharapkan

{
abc: [100, 300, 400],
xyz: [100, 300],
mno: [100, 200],
pqr: [100, 400]
}

Solusi saya:

var results = {};
Object.keys(products).forEach(function(id){
console.log(id)
products[id].forEach(function(user){
   if(typeof results[user] === 'undefined'){
     results[user] = [];
   }
   results[user].push(id)
  })
})
console.log(results)

Apakah ada cara yang lebih baik untuk melakukan ini, seperti peta, perkecil..dll??

1
user1614862 29 Oktober 2019, 04:29

2 jawaban

Jawaban Terbaik

Metode Anda baik-baik saja, saya akan memberikan contoh peta/pengurangan lain sesuai permintaan Anda.

const products = {
  100: ['abc', 'xyz', 'mno', 'pqr'],
  200: ['mno', 'pqr'],
  300: ['abc', 'xyz'],
  400: ['abc', 'pqr'],
}

let result = Object.entries(products)
  .flatMap(([id,tokens])=>tokens.map(token=>({token,id})))
  .reduce((index,{token,id})=>{
    if(index[token]) index[token].push(id) 
    else index[token] = [id]
    return index
   },{})
 
console.log(result)
 
1
apple apple 29 Oktober 2019, 02:50

Ini dia dengan Array Reduce

const products= 
        { 100: [ 'abc', 'xyz', 'mno', 'pqr'] 
        , 200: [ 'mno', 'pqr'] 
        , 300: [ 'abc', 'xyz'] 
        , 400: [ 'abc', 'pqr'] 
        } 

var result= Object.keys(products).reduce((acc, elm)=>
              {
              for (let ref of products[elm]) 
                {
                if (!acc[ref]) acc[ref]= [Number(elm)]
                else           acc[ref].push(Number(elm))
                }
              return acc
              }
              ,{})

for (trace in result) console.log(trace, ':', JSON.stringify(result[trace]))

Sama dengan pengurangan ganda seperti yang ditanyakan @Bergi dalam komentarnya:

const products= 
        { 100: [ 'abc', 'xyz', 'mno', 'pqr'] 
        , 200: [ 'mno', 'pqr'] 
        , 300: [ 'abc', 'xyz'] 
        , 400: [ 'abc', 'pqr'] 
        } 

var result = Object.keys(products).reduce((acc, elm) =>
              products[elm].reduce((acc, ref) =>
                {
                if (!acc[ref]) acc[ref]= [Number(elm)]
                else           acc[ref].push(Number(elm))
                return acc
                }
                , acc)
              , {})

for (trace in result) console.log(trace, ':', JSON.stringify(result[trace]))
1
Bergi 29 Oktober 2019, 02:48