Группировать значения объекта в новом массиве - JavaScript - PullRequest
0 голосов
/ 24 января 2020

Мне нужно вернуть массив с несколькими элементами, извлеченными из массива объектов.

Это оригинальный объект:

    data: Array(11)
       0: {id: "1", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-01", PD_PETROLEO: 369.168, PD_GAS: 96, …}
       1: {id: "2", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-02", PD_PETROLEO: 364.21, PD_GAS: 96, …}
       2: {id: "3", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-03", PD_PETROLEO: 361.559, PD_GAS: 96, …}
       3: {id: "4", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-04", PD_PETROLEO: 322.346, PD_GAS: 81, …}
       4: {id: "5", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-05", PD_PETROLEO: 339.027, PD_GAS: 44, …}
       5: {id: "6", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-06", PD_PETROLEO: 346.939, PD_GAS: 44, …}
       6: {id: "7", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-08", PD_PETROLEO: 321.934, PD_GAS: 44, …}
       7: {id: "8", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-09", PD_PETROLEO: 351.404, PD_GAS: 44, …}
       8: {id: "9", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-10", PD_PETROLEO: 360.167, PD_GAS: 44, …}
       9: {id: "10", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-10", PD_PETROLEO: 371.895, PD_GAS: 44, …}
      10: {id: "11", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-11", PD_PETROLEO: 356.232, PD_GAS: 66, …}

Я использую функцию карты следующим образом:

    const FECHA_DATA = [
       datosDiarios &&
       datosDiarios.data.map(fecha => {
          const { FECHA, PD_GAS, PD_AGUA, PD_PETROLEO } = fecha;
          return FECHA;
       }),
    ];

И я получаю такой результат:

    [Array(11)]
       0: (11) ["2010-06-01", "2010-06-02", "2010-06-03", "2010-06-04", "2010-06-05", "2010-06-06", "2010-06-08", "2010-06-09", "2010-06-1..."]

Но мне нужно, чтобы массив был таким для PD_GAS, PD_PETROLEO и PD_AGUA:

    [Array(11)]
       0: (11) ["2010-06-01", "2010-06-02", "2010-06-03", "2010-06-04", "2010-06-05", "2010-06-06", "2010-06-08", "2010-06-09", "2010-06-1..."],
       1: (11) [96, 96, 96, 81, 44, 44, 44, 44, 44, 44, 66],
       2: (11) [1138.48, 1138.48, 1138.48, 1146.85, 1160.95, 1160.95, 1160.95, 1160.95, 1160.95, 1160.95, 1157.58],
       3: (11) [369.168, 364.21, 361.559, 322.346, 339.027, 346.939, 321.934, 351.404, 360.167, 371.895, 356.232],

Я думаю, что с картой функций это возможно, но если у кого-то есть другой способ сделать это, я буду признателен.

Ответы [ 5 ]

3 голосов
/ 24 января 2020

Array#map здесь не работает, потому что вам нужно повернуть матрицу.

Вы можете взять массив ключей в нужном порядке и pu sh к тому же индекс в качестве ключей.

var data = [{ id: "1", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-01", PD_PETROLEO: 369.168, PD_GAS: 96 }, { id: "2", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-02", PD_PETROLEO: 364.21, PD_GAS: 96 }, { id: "3", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-03", PD_PETROLEO: 361.559, PD_GAS: 96 }, { id: "4", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-04", PD_PETROLEO: 322.346, PD_GAS: 81 }, { id: "5", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-05", PD_PETROLEO: 339.027, PD_GAS: 44 }, { id: "6", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-06", PD_PETROLEO: 346.939, PD_GAS: 44 }, { id: "7", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-08", PD_PETROLEO: 321.934, PD_GAS: 44 }, { id: "8", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-09", PD_PETROLEO: 351.404, PD_GAS: 44 }, { id: "9", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-10", PD_PETROLEO: 360.167, PD_GAS: 44 }, { id: "10", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-10", PD_PETROLEO: 371.895, PD_GAS: 44 }, { id: "11", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-11", PD_PETROLEO: 356.232, PD_GAS: 66 }],
    keys = ['FECHA', 'PD_PETROLEO', 'PD_GAS'],
    result = data.reduce((r, o) => {
        keys.forEach((k, i) => (r[i] = r[i] || []).push(o[k]));
        return r;
    }, []);

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

Причина, по которой .map() не работает, заключается в том, что отображение массива дает результат 1-> 1 из вашего исходного набора данных. Похоже, вы хотите получить результат 4-> 1, где для каждой записи в исходных данных вы хотите создать запись в 4 массивах. Самый простой способ сделать это - использовать функцию .reduce(), например:

let data = [{id: "1", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-01", PD_PETROLEO: 369.168, PD_GAS: 96},
{id: "2", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-02", PD_PETROLEO: 364.21, PD_GAS: 96},
{id: "3", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-03", PD_PETROLEO: 361.559, PD_GAS: 96},
{id: "4", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-04", PD_PETROLEO: 322.346, PD_GAS: 81},
{id: "5", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-05", PD_PETROLEO: 339.027, PD_GAS: 44},
{id: "6", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-06", PD_PETROLEO: 346.939, PD_GAS: 44},
{id: "7", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-08", PD_PETROLEO: 321.934, PD_GAS: 44},
{id: "8", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-09", PD_PETROLEO: 351.404, PD_GAS: 44},
{id: "9", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-10", PD_PETROLEO: 360.167, PD_GAS: 44},
{id: "10", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-10", PD_PETROLEO: 371.895, PD_GAS: 44},
{id: "11", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-11", PD_PETROLEO: 356.232, PD_GAS: 66}];

let mappedData = data.reduce((res, curr) => {
  // push whatever property you want to each spot in the array
  // you can change the order however you'd like
  res[0].push(curr.COMPLETAMIENTO);
  res[1].push(curr.FECHA);
  res[2].push(curr.PD_PETROLEO);
  res[3].push(curr.PD_GAS);
  return res;
}, [[], [], [], []]); // start with an array of 4 empty arrays into which we can push our values

console.log(mappedData)
2 голосов
/ 24 января 2020

вместо карты нужно использовать уменьшение


<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre class="snippet-code-js lang-js prettyprint-override"><code>const data = [
        {id: "1", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-01", PD_PETROLEO: 369.168, PD_GAS: 96}, 
       {id: "2", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-02", PD_PETROLEO: 364.21, PD_GAS: 96},
       {id: "3", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-03", PD_PETROLEO: 361.559, PD_GAS: 96},
       {id: "4", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-04", PD_PETROLEO: 322.346, PD_GAS: 81},
       {id: "5", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-05", PD_PETROLEO: 339.027, PD_GAS: 44},
       {id: "6", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-06", PD_PETROLEO: 346.939, PD_GAS: 44},
       {id: "7", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-08", PD_PETROLEO: 321.934, PD_GAS: 44},
       {id: "8", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-09", PD_PETROLEO: 351.404, PD_GAS: 44},
       {id: "9", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-10", PD_PETROLEO: 360.167, PD_GAS: 44},
       {id: "10", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-10", PD_PETROLEO: 371.895, PD_GAS: 44},
      {id: "11", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-11", PD_PETROLEO: 356.232, PD_GAS: 66}];

const result = data.reduce((acc,item) => {
    const { FECHA, PD_GAS, PD_AGUA, PD_PETROLEO } = item;
    acc[0].push(FECHA);
    acc[1].push(PD_GAS);
    acc[2].push(PD_AGUA);
    acc[3].push(PD_PETROLEO );

    return acc;
}, [[],[],[],[]]);

console.log(result);
0 голосов
/ 24 января 2020

Вы можете сделать что-то вроде этого.

var array = [
      {
        id: 1,
        name: 'foo'
      },
      {
        id: 2,
        name: 'bar'
      },
    ];
    var columns = ['id','name'];
    var items = [];
    var newArray = [];
    columns.forEach((col,iter) => {
      items = array.map((v,k) => { return v[col];}); 
      newArray.push(items);  
    });
    console.log(newArray);
0 голосов
/ 24 января 2020

Вы можете использовать массив ключей, с которыми вы хотите установить vaues, и Array.prototype.map() для достижения этого

const data = [{id: "1", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-01", PD_PETROLEO: 369.168, PD_GAS: 96},
       {id: "2", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-02", PD_PETROLEO: 364.21, PD_GAS: 96},
       {id: "3", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-03", PD_PETROLEO: 361.559, PD_GAS: 96},
       {id: "4", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-04", PD_PETROLEO: 322.346, PD_GAS: 81},
       {id: "5", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-05", PD_PETROLEO: 339.027, PD_GAS: 44},
       {id: "6", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-06", PD_PETROLEO: 346.939, PD_GAS: 44},
       {id: "7", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-08", PD_PETROLEO: 321.934, PD_GAS: 44},
       {id: "8", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-09", PD_PETROLEO: 351.404, PD_GAS: 44},
       {id: "9", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-10", PD_PETROLEO: 360.167, PD_GAS: 44},
       {id: "10", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-10", PD_PETROLEO: 371.895, PD_GAS: 44},
      {id: "11", COMPLETAMIENTO: "CYB-003TS", FECHA: "2010-06-11", PD_PETROLEO: 356.232, PD_GAS: 66}];
      
 
 const output = data.map(obj => Object.values(obj));

 // Or you can use your required keys to get respective values
 const output2 = ['FECHA', 'PD_GAS', 'PD_AGUA', 'PD_PETROLEO'].map(key => data.map(obj => obj[key]));
 
 console.log(output2) // `PD_AGUA is in not in input so will show undefined, since question is not showing all data keys
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...