0
votes

Array de filtre à base d'un autre tableau et combiné

donné deux tableaux:

combinedAndFiltered = [
 {id: "valueA", other: 54, prop: 123},
 {id: "valueB", other: 98, prop: 456}
]


0 commentaires

8 Réponses :


1
votes
inputOne.map((a, i) => ({...a, ...(inputTwo.filter(x => x.id === a.id)[0])}))

5 commentaires

Cette solution suppose que les deux tableaux auront toujours exactement le même index.


Pas d'inquiétude! 🙌


Et si l'un des objets de la première série n'existe pas dans la seconde?


Les choses deviennent désordonnées, mais il y a une solution facile pour cela, aussi, bien sûr ... INTOPTONE.MAP ((A, I) => ({... A, ... (INPUTTWO.FILTER (x => x.id === a.id) [0] || {})}))


Mais autant que je puisse dire en fonction de la question posée, seuls les éléments existants dans les deux ensembles doivent être émis. Cette solution émettrait toujours l'élément si elle n'existe pas dans le deuxième ensemble, elle ne la fusionnera tout simplement pas.



0
votes

Solution simple en utilisant pour : xxx


1 commentaires

Pourquoi continuer itération INPUTTWO une fois qu'un match a été trouvé?



0
votes

Vous pouvez utiliser la carte et filtrer pour résoudre ce problème. Si je ne me trompe pas sur ce que vous voulez, cela pourrait être utile xxx


0 commentaires

1
votes

Convertissez le 1er tableau en un carte A> Utiliser array.reduce ( ) code> , puis réduisez la 2e matrice et si l'objet est trouvé sur la carte, obtenez l'objet de la carte, combinez les objets et ajoutez à l'accumulateur:

p>

const combine = (arr1, arr2) => {
  const arr1Map = arr1.reduce((m, o) => m.set(o.id, o), new Map)
  
  return arr2.reduce((r, o) => arr1Map.has(o.id) ? 
    [...r, { ...o, ...arr1Map.get(o.id) }] : r
  , [])
}

const inputOne = [{id: "valueA", prop: 123},{id: "valueB", prop: 456}]

const inputTwo = [{id: "valueA", other: 54},{id: "valueB", other: 98},{id: "valueC", other: 11}]

const result = combine(inputOne, inputTwo)

console.log(result)


3 commentaires

Pourquoi créer un nouveau tableau à chaque fois au lieu de pousser sur l'accumulateur existant?


Programmation fonctionnelle Immantiabilité - L'accumulateur doit être remplacé par une nouvelle valeur non mutée. Si vous mutez l'accumulateur, vous utilisez la réduction de la boucle. Cependant, comme vous l'avez mentionné, c'est un peu gaspillé. Selon le cas, vous voudrez peut-être réutiliser l'accumulateur (de très grandes matrices par exemple).


Je pense que c'est un peu d'étirement. Avez-vous des références pour soutenir cette déclaration? Pourquoi la mutation de l'accumulateur serait-elle une mauvaise chose?



1
votes

Cela devrait faire l'astuce (en supposant que le Inputone code> agit comme une source);

p>

const inputOne = [
 {id: "valueA", prop: 123},
 {id: "valueB", prop: 456}
]

const inputTwo = [
 {id: "valueA", other: 54},
 {id: "valueB", other: 98},
 {id: "valueC", other: 11}
]

const mergeArrays = (first, second) => {
  return first.map((firstItem) => {
    const obj = second.find((secondItem) => secondItem.id === firstItem.id);
    return {...firstItem, ...obj};
  });
};

const combinedArrays = mergeArrays(inputOne, inputTwo);

console.log(combinedArrays);


1 commentaires

Et si l'un des objets de la première série n'existe pas dans la seconde?



0
votes

Eh bien, vous pouvez d'abord construire un objet et l'utiliser pour obtenir les autres valeurs tout en itérant sur l'autre matrice avec un .map code>

p>

const inputOne = [
 {id: "valueA", prop: 123},
 {id: "valueB", prop: 456}
],
 inputTwo = [
 {id: "valueA", other: 54},
 {id: "valueB", other: 98},
 {id: "valueC", other: 11}
],
ids = {};

inputTwo.forEach(function (o) {
    ids[o.id] = o;
});

var res = inputOne.map(function (o) {
    return {
        other: ids[o.id].other,
        prop: o.prop,
        id: o.id
    };
});

console.log(res)


1 commentaires

Et si l'un des objets de la première série n'existe pas dans la seconde?



0
votes

Je pense que toutes les solutions seront à peu près toutes les solutions seront une variété de double itération, que ce soit par boucle, carte ou filtre. L'autre sens différent de ceux énumérés ci-dessus consiste à utiliser une bibliothèque comme Lodash. Cette réponse donne déjà un très bon exemple du Unionby fonction .


0 commentaires

1
votes

Cette solution suppose qu'il n'y aura que deux ensembles, et la propriété ID code> est unique dans chaque ensemble.

Vous pouvez créer une intersection de deux ensembles d'objets fusionnés basés sur une propriété commune ( ID code>) par: p>

  • Itérez le premier ensemble, puis recherchez le deuxième ensemble pour l'élément actuel de la première série. li>
  • Si une correspondance est trouvée, combinez les deux objets dans un nouvel objet, puis ajoutez cet objet à un ensemble d'accumulateur. li>
  • retourner l'accumulateur li> ul>

    Cette méthode renvoie un nouvel ensemble contenant des objets fusionnés que l'on trouve dans les deux ensembles. Si un objet est manquant à partir de l'un ou l'autre définir, il ne sera pas inclus dans la sortie. P>

    p>

    const inputOne = [ {id: "valueA", prop: 123}, {id: "valueB", prop: 456}, {id: "valueD", prop: 789} ]
    const inputTwo = [ {id: "valueA", other: 54}, {id: "valueB", other: 98}, {id: "valueC", other: 11} ]
    
    function intersectAndMerge(a, b) {
      return a.reduce((accumulator, { id, ...props }) => {
        const match = b.find(e =>  e.id === id)
        if(match !== undefined) {
          accumulator.push({ ...match, ...props })
        }
        return accumulator
      }, [])
    }
    
    console.log(intersectAndMerge(inputOne, inputTwo))

  • 0 commentaires