CoffeeScript - преобразование объекта в матрицу с использованием интерпретаций - PullRequest
0 голосов
/ 09 мая 2020

У меня есть объект в форме: {a: [1,2,3,4], b: [5,6,7,8]}, и я хочу преобразовать его, используя понимания, в массив массивов из 3 элементов:

[
  ['a', 0, 1], ['a', 1, 2], ['a', 2, 3], ['a', 3, 4],
  ['b', 0, 5], ['b', 1, 6], ['b', 2, 7], ['b', 3, 8]
]

Я пробовал это ( [x,y,v] for v, y in h for x, h of obj ), но он дает массив из двух элементов по 4 элемента:

[ 
  [ [], [], [], [] ],
  [ [], [], [], [] ]
]

Как пропустить массив второго уровня?

1 Ответ

0 голосов
/ 11 мая 2020

Это легче увидеть, когда вы разделите два понимания:

result = for x, h of obj
  for v, y in h 
    [x,y,v] 

Ваш результат будет двухуровневым, поскольку каждое понимание возвращает массив.

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

Каждый из этих массивов будет содержать результаты для одного ключа в вашем объекте


Лучший способ обойти это - использовать pu sh каждый из трех массивов элементов, которые вы хотите, в отдельный массив.

result = []
for x, h of obj
  for v, y in h
    result.push [x,y,v]

В качестве альтернативы с компактным форматированием:

result = []
result.push [x,y,v] for v, y in h for x, h of obj 

Если у вас уже есть служебная библиотека, например loda sh, вы можете использовать метод flatten. Но это потребует еще одной итерации над вашими массивами, поэтому это непрактично, если производительность имеет значение и у вас очень большие наборы данных

...