Преобразование объекта JavaScript из одной формы в другую - PullRequest
1 голос
/ 29 октября 2019

Ввод

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

Ожидается

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

Мое решение:

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)

есть лучший способ сделать это, например, карта, уменьшить .. и т.д. ??

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Ваш метод в порядке, я бы предоставил другой пример карты / уменьшения по вашему запросу.

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 голос
/ 29 октября 2019

вот оно с 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]))

то же самое с двойным уменьшением, как @ Bergi спросил в своем комментарии:

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]))
...