@Kafkae

Как разбить массив на части?

Завис в создание массивов из другого массива, например для графика.
у меня есть массив такого вида:
[
  [x1, y1, x2, y2],
  [x1, y1, x2, y2],
  [x1, y1, x2, y2]
]

например:
const data = [
  [1497052800, 100, 1597052800, 120, 1597052800, 120],
  [1497139200, 140, 1597052800, 80],
  [1497225600, 200, 1597052800, 222],
  [1497312000, 80, 1597052800, 100],
 ]

А нужно сделать вот такие штуки, по меньше
[
  [x1, y1],
  [x1, y1],
  [x1, y1]
]

[
  [x2, y2],
  [x2, y2],
  [x2, y2]
]

Те нужно разбить x y по парам. и их может быть разное количество еще
Допер до такой конструкции:
const newArr = flattenDeep(data, 2)
  .filter((e, i) => i % 2)
  .reduce(
    (acc, el, i) => [
      ...acc,
      [flattenDeep(data, 2)[i * 2], flattenDeep(data, 2)[i * 2 + 1]]
    ],
    []
  );

Но она не правильная вроде. https://codesandbox.io/s/wkl72pymz5
Как сделать чтобы работало как надо, уже всю голову сломал =/
  • Вопрос задан
  • 192 просмотра
Пригласить эксперта
Ответы на вопрос 3
profesor08
@profesor08 Куратор тега JavaScript
const data = [
  [1497052800, 100, 1597052800, 120, 1597052800, 120],
  [1497139200, 140, 1597052800, 80],
  [1497225600, 200, 1597052800, 222],
  [1497312000, 80, 1597052800, 100],
];

function getItems(arr, from, to) {
  return arr.map(arr => arr.filter((e, id) => id >= from && id <= to));
}

// data - сам массив, 0,1 это диапазон индексов, с какого по какой делать выборку
getItems(data, 0, 1); // первые два
getItems(data, 2, 3); // вторые два


Если у тебя там например [x1,y1,z1,x2,y2,z2], то
getItems(data, 0, 2); 
getItems(data, 3, 5);


Если [x1,y1,x2,y2,x3,y3], то
getItems(data, 0, 1); 
getItems(data, 2, 3); 
getItems(data, 4, 5);
Ответ написан
Комментировать
@MamaLuyba
если у тебя будет строгий порядок, где x2 будет через один элемент после x1, то проходи по элементам подмассива [x1, y1, x2, y2], делай push arr[0] и arr[1] в новый подмассив [x1, y1], удаляй их же из оригинального подмассива, затем опять проходи по оригинальному подмассиву с тем же условием, пока не закончатся элементы. потом push этот новый подмассив в новый массив, затем бери следующий подмассив.
Ответ написан
Комментировать
@StockholmSyndrome
const result = data.reduce((acc, curr) => {
  curr.filter((_, i) => i % 2 === 0).forEach((item, i) => {
    (acc[i] = acc[i] || []).push([item, curr[i * 2 + 1]]);
  });
  return acc;
}, Array(Math.max(...data.map((item) => item.length)) / 2).map(() => []));


console.log(result);  
/* 
  [
    [
      [1497052800, 100],
      [1497139200, 140],
      [1497225600, 200],
      [1497312000, 80]
    ], [
      [1597052800, 120],
      [1597052800, 80],
      [1597052800, 222],
      [1597052800, 100]
    ], [
      [1597052800, 120] 
    ] 
  ]
*/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы