Массив точечных объектов к массивам X и Y - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть массив point объектов:

const points = [ {x: 0, y: 0 }, { x: 1, y: 1}, ...]

Я хочу преобразовать их в массивы x и y:

const x = [0, 1, ...];
const y = [0, 1, ...];

Я мог бы использовать 2 карты:

const x = points.map(v => v.x);
const y = points.map(v => v.y);

Но для этого нужно 2 итерации по массиву.Я могу сделать цикл:

const x = [];
const y = [];
for (let i = 0; i < points.length; ++i) {
   const pt = points[i];
   x.push(pt.x);
   y.push(pt.y);
}

Это кажется слишком многословным и потенциально медленным (все эти отступления).Есть ли лучший метод?

Ответы [ 5 ]

0 голосов
/ 17 сентября 2018

Вы можете использовать array#reduce для накопления результата в многомерном массиве.

const points = [ {x: 0, y: 0 }, { x: 1, y: 1}],
      [x,y] = points.reduce((r,o) => {
        Object.values(o).forEach((v,i) => r[i].push(v));
        return r;
      },[[],[]]);
console.log(x);
console.log(y);
0 голосов
/ 17 сентября 2018

Хотя вы можете сделать это достаточно легко, скажите так:

const points = [{x: 1, y: 2}, {x: 2, y: 3}, {x: 3, y: 5}, {x: 4, y: 7}, {x: 5, y: 11}]

const {x, y} = points.reduce(
  ({x, y}, pt) => ({x: [...x, pt.x], y: [...y, pt.y]}),
  {x: [], y: []}
)

console.log(x)
console.log(y)

есть более важный вопрос, который вам нужно рассмотреть из , почему вы хотите это сделать.Оригинальная структура является гибкой и полезной, и у вас уже есть это в памяти.Новые структуры зависят от общих индексов, с которыми часто трудно работать и которые можно легко потерять синхронизацию.Есть ли веская причина не использовать оригинальную структуру?

0 голосов
/ 17 сентября 2018

Хорошо, вы можете сделать что-то вроде этого:

const points = [ {x: 0, y: 0 }, { x: 1, y: 1}];

const t = points.map(item => {
	return Object.values(item);
})

const x = t[0];
const y = t[1];
console.log(x,y);
0 голосов
/ 17 сентября 2018
var x= [], y = [], points = [{ x: 0, y: 0 }, { x: 1, y: 10 }];

points.forEach(({x: x1, y: y1}) => (x.push(x1), y.push(y1)))

console.log(x, y)
0 голосов
/ 17 сентября 2018

По крайней мере, вам нужно подтолкнуть к нужным наборам результатов. Это решение использует объект для перемещения в правый массив.

const
    points = [{ x: 0, y: 0 }, { x: 1, y: 1 }],
    x = [],
    y = [],
    values = { x, y };
    
points.forEach(o => Object.entries(o).forEach(([k, v]) => values[k].push(v)));

console.log(x);
console.log(y);

В основном то же самое, но с известными ключами.

const
    points = [{ x: 0, y: 0 }, { x: 1, y: 1 }],
    x = [],
    y = [],
    values = { x, y },
    keys = Object.keys(values);
    
points.forEach(o => keys.forEach(k => values[k].push(o[k])));

console.log(x);
console.log(y);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...