Манипулирование объектами - PullRequest
0 голосов
/ 17 сентября 2018

Я использую PHP или Javascript для манипулирования объектом json из примера API:

{
"data": [
    {
        "label": "employeeCount",
        "stats": [
            {
                "year": "2015",
                "value": "10"
            },
            {
                "year": "2017",
                "value": "30"
            },
            {
                "year": "2016",
                "value": "50"
            }
        ]
    },
    {
        "label": "managerCount",
        "stats": [
            {
                "year": "2015",
                "value": "2"
            },
            {
                "year": "2017",
                "value": "4"
            },
            {
                "year": "2016",
                "value": "6"
            }
        ]
    }
  ]
}

Мне нужно классифицировать его по году как объект, подобный такому:

"record": {
  "2015" : {
    "employeeCount": "10",
    "managerCount": "2"
  },
  "2016" : {
    "employeeCount": "30",
    "managerCount": "4"
  },
  "2017"{
    "employeeCount": "50",
    "managerCount": "6"
  }
}

Число year и число label будут отличаться от вызова API, поэтому я думаю об использовании цикла for, чтобы это произошло. Но пока безуспешно. Какой подход вы бы использовали для такого рода манипуляций?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018
let data = json.data
let map={}
for(let i=0;i<data.length;i++){
    let stats = data[i].stats
    for(let j=0;j<stats.length;j++){
        let it = stats[j]
        if(!map[it.year]){
            map[it.year]={}
        }
        map[it.year][data[i].label]=it.value
    }
}
console.log({record:map})
0 голосов
/ 17 сентября 2018

Использование Array.forEach

LOGIC - Идея состоит в том, чтобы перебрать data array в объекте, а затем для каждой записи в массиве данных перебрать соответствующий емуstats array для заполнения объекта на основе year.При выполнении итерации stat array, проверяет существующую запись в результирующем объекте .Если не существует, создайте запись для него.Обновите запись, добавив label как key и value из соответствующего объекта в stat array.

let obj = {"data":[{"label":"employeeCount","stats":[{"year":"2015","value":"10"},{"year":"2017","value":"30"},{"year":"2016","value":"50"}]},{"label":"managerCount","stats":[{"year":"2015","value":"2"},{"year":"2017","value":"4"},{"year":"2016","value":"6"}]}]};

// Create the response object
let r = {"record":{}};
// Iterate over data array
obj.data.forEach(o => {
  // Iterate over stats for each object in data array
  o.stats.forEach(s => {
    // Create entry for year in result object if it does not exist
    r.record[s.year] = r.record[s.year] || {};
    // Add the label of data array object with corresponding stat value in resultant object
    r.record[s.year][o.label] = s.value;
  });
});
console.log(r);
...