получить массив уникальных значений свойств из массива объектов - PullRequest
0 голосов
/ 27 мая 2020

Итак, у меня есть массив объектов ссылок из d3

nodelinks
(6) […]
0: Object { index: 1, source: {…}, target: {…} }
1: Object { index: 5, source: {…}, target: {…} }
2: Object { index: 8, source: {…}, target: {…} }
3: Object { index: 9, source: {…}, target: {…} }
4: Object { index: 10, source: {…}, target: {…} }
5: Object { index: 21, source: {…}, target: {…} }
length: 6
<prototype>: Array []

И я хочу получить из него новый массив, содержащий уникальные узлы, как source, так и target. У меня получилось вот так:

_nodes = []
nodelinks.forEach(x => {
  if (!(x.target in _nodes)){_nodes.push(x.target)};
  if (!(x.source in _nodes)){_nodes.push(x.source)};
});

new Set(_nodes).forEach(x => d3.select(`#${x.id}`).classed('active', true))

Но правда! Должен быть способ получше: какая-нибудь умная идиома javascripty с map() или filter() или что-то в этом роде, да? Или, может быть, у d3 есть какой-то собственный метод массива? В python я бы использовал понимание списка. Должно быть, мне не хватает чего-то очевидного.

есть подсказки?

1 Ответ

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

Ха! Я знал, что мне не хватает чего-то очевидного: Array().flat() Очень полезно: вместо того, чтобы перебирать массив объектов nodelinks и переходить к новому массиву, я могу просто использовать map ( ) вот так:

new Set(nodelinks.map(x => [x.source, x.target]).flat())

Извините за шум, но, может быть, мои наивные тряски могут быть поучительными.

...