Étant donné le tableau, comment filtrer le layer.id correspondant au tableau?

nodes = [
    {id: '1', layer: {id: 'a'}},
    {id: '4', layer: {id: 'b'}},
    {id: '2'},
    {id: '3'},
]

argument = 'a'

// OUTPUT
[
    {id: '4', layer: {id: 'b'}},
    {id: '2'},
    {id: '3'},
]

Cette instruction efface en quelque sorte les éléments 2 et 3 du tableau car je vérifie le champ node.layer.

nodes.filter(node => node.layer && node.layer.id !== id) // TO-DO: How do I flip..?
    .map(node => node.id);
0
hellofanengineer 22 avril 2020 à 22:54

3 réponses

Meilleure réponse

Inversez le test pour node.layer et utilisez || au lieu de &&.

const nodes = [
    {id: '1', layer: {id: 'a'}},
    {id: '4', layer: {id: 'b'}},
    {id: '2'},
    {id: '3'},
];

argument = 'a';
const result = nodes.filter(node => !node.layer || node.layer.id != argument).map(({id}) => id);
console.log(result);
1
Barmar 22 avril 2020 à 19:58

Vous avez déjà décrit avec précision pourquoi votre première approche ne fonctionne pas. Pour surmonter le problème, reculez et réalisez que vous devez conserver les éléments qui n'ont ni couche ni couche avec le même id que celui spécifié.

Cela mène à:

1 Compte tenu du tableau, comment puis-je filtrer le layer.id correspondant au tableau?

nodes = [
    {id: '1', layer: {id: 'a'}},
    {id: '4', layer: {id: 'b'}},
    {id: '2'},
    {id: '3'},
]

argument = 'a'

console.log(nodes.filter(node => !node.layer || node.layer.id !== argument))

(J'ai laissé de côté votre utilisation de .map parce qu'alors la sortie ne correspond pas à ce que vous avez montré comme souhaité - mais vous pouvez le mettre aussi si vous préférez.)

1
Robin Zigmond 22 avril 2020 à 20:00

Je pense que vous devez ajouter une condition supplémentaire à la méthode .filter, comme ceci:

var output = nodes.filter(n => {
  if ('layer' in n) {
    return n.layer.id !== argument;
  }
  return n;
});

Le return n; renverra les éléments 2 et 3 au cas où l'accessoire layer n'existerait pas.

0
dazs 22 avril 2020 à 20:38