簡體   English   中英

將對象數組轉換為數組對象

[英]Convert array of objects to an object of arrays

我有以下結構

var nights = [
    { "2016-06-25": 32, "2016-06-26": 151, "2016-06-27": null },
    { "2016-06-24": null, "2016-06-25": null, "2016-06-26": null },
    { "2016-06-26": 11, "2016-06-27": 31, "2016-06-28": 31 },
];

我想將其轉換為:

{ 
    "2016-06-24": [null], 
    "2016-06-25": [32, null], 
    "2016-06-26": [151, null, 11], 
    "2016-06-27": [null, 31], 
    "2016-06-28": [31] 
}

解決這個問題的最短方法是什么? 使用Underscore,Lodash或jQuery我沒有問題。

我當前的代碼是:

var out = {};
for (var i = 0; i < nights.length; i++) {
    for (var key in nights[i]) {
        if (out[key] === undefined) {
            out[key] = [];
        }
        out[key].push(nights[i][key]);
    }
}

它類似於使用lodash將對象數組轉換為數組對象,但是每個對象中都包含所有鍵。

您可以使用以下代碼段(不需要lodash等)完成此操作:

 const x = [{ '2016-06-25': 32, '2016-06-26': 151, '2016-06-27': null }, { '2016-06-24': null, '2016-06-25': null, '2016-06-26': null }, { '2016-06-26': 11, '2016-06-27': 31, '2016-06-28': 31 }, ]; let y = {}; x.forEach(obj => { Object.keys(obj).forEach(key => { y[key] = (y[key] || []).concat([obj[key]]); }); }); console.log(y) 

您可以遍歷數組和對象的鍵,並使用鍵作為新鍵構建新對象。

 var data = [{ '2016-06-25': 32, '2016-06-26': 151, '2016-06-27': null }, { '2016-06-24': null, '2016-06-25': null, '2016-06-26': null }, { '2016-06-26': 11, '2016-06-27': 31, '2016-06-28': 31 }, ], result = {}; data.forEach(function (o) { Object.keys(o).forEach(function (k) { result[k] = result[k] || []; result[k].push(o[k]); }); }); console.log(result); 

使用的打字稿-顯然,您可以在使用JavaScript時刪除這些打字稿。

假設:進入函數的對象數組將始終具有相同種類和數量的對象鍵

mapperArrayOfJsonsToJsonOfArrays(inputArrayOfJsons: any): any {
    if (inputArrayOfJsons.length > 0) {
        let resultMap = {};
        let keys: any[] = Object.keys(inputArrayOfJsons[0]);
        keys.forEach((key: any) => {
            resultMap[key] = [];
        });

        inputArrayOfJsons.forEach((element: any) => {
            let values: any[] = Object.values(element);
            let index = 0;
            values.forEach((value: any) => {
                resultMap[keys[index]].push(value);
                index = index + 1;
            });
        });
        return resultMap;
    }
    return {};
}

這是我的班輪。 使用map將鍵映射到具有鍵屬性的對象數組。 然后將原始數組僅映射到該屬性,並將其設置為該屬性的值。 這種方法的一個問題是,它將僅使用數組中第一個對象的屬性。 因此,如果其他對象的屬性不在第一個對象中,則將忽略它們。

const output = Object.assign({}, ...Object.keys(input[0]).map(props => ({[props]: input.map(prop => prop[props])})))

編輯:輸出格式錯誤,已修復

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM