Чтобы отформатировать javascript объект с массивом объектов в массив массивов - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть объект ниже, который имеет массив объектов. Я хочу отформатировать этот объект в объект Array of arrays

var object1 = {
  "Usa": [{
    "period": "2018-11-03T00:00:00.000+0000",
    "qty": 1
  }, {
    "period": "2018-11-04T00:00:00.000+0000",
    "qty": 2
  }],
  "india": [
    {
      "period": "2018-19-03T00:00:00.000+0000",
      "qty": 2
    }, {
      "period": "2018-19-04T00:00:00.000+0000",
      "qty": 3
    }
  ]
}

export const createDataPoint = (period, qty) => {
  return [
    Date.now(time),
    Math.round((Math.random() * 100) * 2) / 2 + quantity,

  ];
};

export function createData(object1) {
  let data = [];
  let total = [];
  Object.keys(object1).map(function(item, index) {
    object1[item].map(function(item2, index2) {
      data.push(createDataPoint(item2.period, item2.qty));
    })
    object1[item] = data
  })
  // console.log(object1)
  return object1;
}

Но вывод таков: в каждом массиве есть 4 массива вместо 2 соответствующих массивов. Это означает, что в каждом массиве я получаю полные массивы размером 4.

Ожидаемый результат -

  var object1={
     "Usa":[
      ["123245235",1],
      ["21423435",2]
     ],
    "india":[   
       ["234325436",2],
        ["23422464",3]
    ]    
  }

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Это альтернатива, использующая функцию Object.entries для получения записей следующим образом [country, array] и затем с помощью функции reduce для создания желаемого результата.

Функция map сгенерирует массивс индексами буксировки.

Этот подход не изменяет исходный объект

var object1={  "Usa":[       {"period": "2018-11-03T00:00:00.000+0000",               "qty": 1           }, {               "period": "2018-11-04T00:00:00.000+0000",               "qty": 2           } ], "india":[   {    "period": "2018-19-03T00:00:00.000+0000",               "qty": 2           }, {               "period": "2018-19-04T00:00:00.000+0000",               "qty": 3           } ]    },
    result = Object.entries(object1).reduce((a, [country, arr]) => {
      return Object.assign(a, {[country]: arr.map(({period, qty}) => [Date.now(period), qty])});
    }, Object.create(null));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 13 ноября 2018

Вы можете использовать Array.prototype.reduce & Object.entries :

var obj = { "Usa": [{ "period": "2018-11-03T00:00:00.000+0000", "qty": 1 }, { "period": "2018-11-04T00:00:00.000+0000", "qty": 2 }], "india": [{ "period": "2018-19-03T00:00:00.000+0000", "qty": 2 }, { "period": "2018-19-04T00:00:00.000+0000", "qty": 3 }] }

const result = Object.entries(obj)
  .reduce((r, [k,v]) => (r[k] = v.map(({period, qty}) => [period, qty]), r),{})
console.log(result)

Несколько простой подход может быть осуществлен через Object.keys & reduce:

var obj = { "Usa": [{ "period": "2018-11-03T00:00:00.000+0000", "qty": 1 }, { "period": "2018-11-04T00:00:00.000+0000", "qty": 2 }], "india": [{ "period": "2018-19-03T00:00:00.000+0000", "qty": 2 }, { "period": "2018-19-04T00:00:00.000+0000", "qty": 3 }] }

const result = Object.keys(obj)
  .reduce((r, c) => (r[c] = obj[c].map(({period, qty}) => [period, qty]), r),{})
console.log(result)
0 голосов
/ 13 ноября 2018

Просто переназначить каждый массив на новый сопоставленный массив

const createDataPoint = ({period, qty})=>{
    // do your processing here, just returning period & qty for simplicity 
    return [period, qty]
}

Object.keys(data).forEach(k=>{
    data[k] = data[k].map(createDataPoint);
})

console.log(data)
<script>
  const data = {
    "Usa": [{
      "period": "2018-11-03T00:00:00.000+0000",
      "qty": 1
    }, {
      "period": "2018-11-04T00:00:00.000+0000",
      "qty": 2
    }],
    "india": [{
        "period": "2018-19-03T00:00:00.000+0000",
        "qty": 2
      }, {
        "period": "2018-19-04T00:00:00.000+0000",
        "qty": 3
      }

    ]
  }
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...