首页 > 解决方案 > 将 javascript 对象从一种形式转换为另一种形式

问题描述

输入

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?

标签: javascriptmapreduce

解决方案


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


推荐阅读