将javascript对象从一种形式转换为另一种形式

时间:2019-10-29 01:29:40

标签: javascript mapreduce

输入

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)

有没有更好的方法,例如map,reduce..etc?

2 个答案:

答案 0 :(得分:1)

这里是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]))

答案 1 :(得分:1)

您的方法很好,我会根据您的要求提供另一个map / reduce示例。

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)
 

相关问题