2017-10-05 112 views
0

的单个阵列我寻找对象的合并数组到对象的单一阵列和附加对象的键从内对象的键合并对象的阵列到对象

每个键我有对象像

var myObj = { 
       "Details": [{ 
         "car": "Audi", 
         "price": 40000, 
         "color": "blue" 
        }, 
        { 
         "car": "BMW", 
         "price": 35000, 
         "color": "black" 
        } 
       ], 
       "Accounts": [{ 
         "Total": 2000 
        }, 
        { 
         "Total": 3000 
        } 
       ] 
      } 

和密钥和对象长度是不知道,我想合并它像

[ 
      { 
      "Detailscar": "Audi", 
      "Detailsprice": 40000, 
      "Detailscolor": "blue", 
      "AccountsTotal": 2000 
      }, 
      { 
      "Detailscar": "BMW", 
      "Detailsprice": 35000, 
      "Detailscolor": "black", 
      "AccountsTotal": 3000 
      } 
     ] 

我与Ramda mergeAll尝试,但它不是在我的情况下工作,因为它仅合并对象

这里是我试过

var mergedArray = [] 
     R.mapObjIndexed((instance, instanceName) => { 
      mergedArray.push(R.map((innerObj) => { 
       var customObject = {}; 
       R.forEach((key) => { 
        customObject[`${instanceName}${key}`] = innerObj[key] 
       }, Object.keys(innerObj)) 
       return customObject; 
      }, instance)) 
     }, myObj) 

我想添加到每个修改的对象到mergerArray数组,但它增加了对每个迭代,最后,它正在创建2个阵列

mergedArray仍然创造两个不同的数组,其中的对象的关键要附加到对象的属性,但我希望它被合并到单个对象数组中。

我错过了一些东西。我该怎么做才能解决这个问题?

建议一些帮助。

+0

@Sam我已经收回选票,但我不是唯一一个投了赞成票的人。所以你的问题可能会被关闭。这就是分享努力很重要的原因。 – Rajesh

回答

0

使用Array.prototype.map和指数作为第二个参数中国率先向它的回调从客户对象获取元素

const data = { 
 
    "Details": [ 
 
    { 
 
     "car": "Audi", 
 
     "price": 40000, 
 
     "color": "blue" 
 
    }, 
 
    { 
 
     "car": "BMW", 
 
     "price": 35000, 
 
     "color": "black" 
 
    }, 
 
    { 
 
     "car": "Porsche", 
 
     "price": 60000, 
 
     "color": "green" 
 
    } 
 

 
    ], 
 
    "Accounts": [ 
 
    { 
 
     "Total": 2000 
 
    }, 
 
    { 
 
     "Total": 3000 
 
    }, 
 
    { 
 
     "Total": 3000 
 
    } 
 

 
    ] 
 
}; 
 

 
const mergeCarData = ({ Details, Accounts} = {}) => { 
 
    return Details.length === Accounts.length ? Details.map(({ car, price, color}, idx) => ({ 
 
    Detailscar: car, 
 
    Detailsprice: price, 
 
    Detailscolor: color, 
 
    AccountsTotal: Accounts[idx].Total 
 
    })) : []; 
 
}; 
 

 
console.log(mergeCarData(data));

1

在普通的JavaScript,你可以重复给定对象的键和迭代数组并使用新密钥从内部属性中构建一个新对象。

var object = { Details: [{ car: "Audi", price: 40000, color: "blue" }, { car: "BMW", price: 35000, color: "black" }], Accounts: [{ Total: 2000 }, { Total: 3000 }] }, 
 
    result = Object.keys(object).reduce(function (returnValue, parentKey) { 
 
     object[parentKey].forEach(function (currentObj, i) { 
 
      returnValue[i] = returnValue[i] || {}; 
 
      Object.keys(currentObj).forEach(function (childKey) { 
 
       returnValue[i][parentKey + childKey] = currentObj[childKey]; 
 
      }); 
 
     }); 
 
     return returnValue; 
 
    }, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

我刚刚更新了变量名,以便它更容易阅读。如果您认为不需要,请回复它。 :-) – Rajesh

1

嗯,这是不漂亮,但你可以做这样的事情:

const convert = pipe(
    mapObjIndexed((val, name) => pipe(
    map(toPairs), 
    map(map(([prop, propVal]) => objOf(name + prop, propVal))), 
    map(mergeAll), 
)(val)), 
    values, 
    apply(zipWith(merge)) 
) 

你可以看到在行动本就Ramda REPL

1

在这里,你去,另一种选择。我从ramda配方列表中提取了一个renameBy函数。如果你愿意的话,你可以把所有东西合并到一行上。

// https://github.com/ramda/ramda/wiki/Cookbook#rename-keys-of-an-object 
const renameBy = R.curry((fn, obj) => R.pipe(R.toPairs, R.map(R.adjust(fn, 0)), R.fromPairs)(obj)); 

let convertNames = R.mapObjIndexed((value, key)=> { 
    return R.map(renameBy(R.concat(key)), value) 
}) 

let mergeUp = R.pipe(R.values, R.reduce(R.mergeDeepLeft,[]), R.values) 

let convert = R.pipe(convertNames, mergeUp) 
convert(myObj)