2017-10-05 116 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)