J'ai le code ci-dessous que j'attends pour mapper le résultat du tableau imbriqué et retourner un seul tableau ayant les deux identifiants mais j'obtiens 2 tableaux à la place. Quelqu'un peut-il me guider sur ce que je fais mal?

arrayVal = [{
    sources: {
      data: [{
        id: 1
      }]
    }
  },
  {
    sources: {
      data: [{
        id: 2
      }]
    }
  }
]

for (let sub of arrayVal) {
  let result = sub.sources.data.map(x => (x.id))
  console.log(result)
}
2
Hopez 23 mai 2018 à 07:35

5 réponses

Meilleure réponse

Essayez de suivre

var arrayVal = [{sources: {data: [{id: 1}]}},{sources: {data: [{id: 2}]}}];

// Create an array on sources.data and merge it into 1 collection (array)
var result = arrayVal.reduce((a, c) => [...a, ...c.sources.data.map(({id}) => id)], []);

console.log(result);

Pour référence, Array.reduce

Vous pouvez également améliorer votre code comme suit

var arrayVal = [{sources: {data: [{id: 1}]}},{sources: {data: [{id: 2}]}}];

let result = [];
for (let sub of arrayVal) {
  result.push(sub.sources.data.map(x => (x.id)));
}
console.log([].concat(...result))
3
Nikhil Aggarwal 23 mai 2018 à 04:47
arrayVal = [{
    sources: {
      data: [{
        id: 1
      }]
    }
  },
  {
    sources: {
      data: [{
        id: 2
      }]
    }
  }
]

let result = [];
for (let sub of arrayVal) {
  result = result.concat(sub.sources.data.map(x => (x.id)))

}

console.log(result)

Je pense que concat est ce qui vous manquait ici, j'espère que c'est ce que vous essayez d'atteindre

3
Gaurav joshi 23 mai 2018 à 04:39

À l'heure actuelle, vous appelez map pour chaque élément dans arrayVal, vous obtenez donc deux tableaux. Utilisez reduce à la place, pour transformer un tableau d'objets en un autre tableau qui n'est pas nécessairement un à un avec les éléments d'entrée:

const arrayVal=[{sources:{data:[{id:1}]}},{sources:{data:[{id:2}]}}];

const result = arrayVal.reduce((a, { sources: { data } }) => (
  [...a, ...data.map(({ id }) => id)]
), []);
console.log(result)
4
CertainPerformance 23 mai 2018 à 04:44

Vous pouvez faire quelque chose comme ça:

arrayVal = [{
    sources: {
      data: [{
        id: 1
      }]
    }
  },
  {
    sources: {
      data: [{
        id: 2
      }]
    }
  }
]

var flat = arrayVal.reduce(function(prev,curr,cI){
  prev.push(curr.sources.data.map(x => (x.id))[0]);
  return prev; // *********  Important ******
}, []);
1
Neeraj Wadhwa 23 mai 2018 à 04:48

Essaye ça

arrayVal = [{
    sources: {
      data: [{
        id: 1
      }]
    }
  },
  {
    sources: {
      data: [{
        id: 2
      }]
    }
  }
]

let result = arrayVal.map((x) => x.sources.data[0].id)
console.log(result)
1
ekbgh 23 mai 2018 à 04:46