0
votes

Comment créer un objet fusionné à partir d'un tableau d'objets conserve les propriétés de l'objet d'origine non modifié à partir du nouvel objet entrant

Je dois vous installer / organiser des ensembles ... XXX PRE>

En fin de compte, je souhaite que les objets de Test2 modifient les propriétés dans le test mais préservent la propriété de localisation dans l'objet d'origine car il n'a pas changé ou même référencé dans le test2. P>

Ce que j'ai fait a été configuré une mappage que la clé est l'identifiant et utilise chaque objet comme valeur. P>

Le problème se produit que la valeur du nouvel objet par la clé écrase l'objet d'origine précédent dans son ensemble. Par conséquent, la propriété de localisation est éliminée de la matrice d'origine. p>

notamment de objet.Assign () L'objet nu non présenté sous forme de tableau d'objets conservera l'intégrité de l'objet d'origine et ne modifie que des propriétés sous-jacentes. p>

Voici un exemple de: P>

Array d'objets: P>

var test = [{id: 1, prop: 'bill', location: 'san diego'},{id: 11, prop: 'bright'}];
var first = new Map();
for (const value of test) {
    //console.log(key + ' = ' + value.id);
    first.set(value.id, value);
    //console.log(first);
}
var test2 = [{id: 1, prop: 'casey'},{id: 11, prop: 'candle'}];
var second = new Map();
for (const value of test2) {
    second.set(value.id, value);
}

var merged = new Map([...first, ...second]);

let mergedArray = [];
for (var value of merged.values()) {
  console.log(' = ' + value);
    mergedArray.push(value);
}

console.log('merged', mergedArray);
// console.log(merged)

// console.log('second2', second);
// console.log('first2 ', first);


1 commentaires

Appliquez le principe de Kiss.


3 Réponses :


1
votes
const merged = test.map(ele => {
  const found = test2.find(({id}) => id === ele.id) || {}
  return {...ele, ...found}
})

loop over test
find the same id element in test2 (if not found set an empty object)
return the merged object where test is the source and test2 contains the overwrites/additions

3 commentaires

ok donc ce que je crois que je faisais mal ... essentiellement, c'est la même chose, à l'exception de chacun de mon identifiant de ma carte, c'est une valeur alors quand elle fusionne la valeur complète de la fusion ... mais j'avais besoin de chaque objet pour remplacer les propriétés qui sont ce que vous avez fait. intéressant.


Si ma solution était la chose que vous recherchez, marquez-la comme acceptée ou demandez une aide supplémentaire


édité le fonctionnement pour travailler même si test2 a des membres qui n'existent pas dans test



0
votes

Essayez quelque chose comme ça.

p>

const test = [{
    id: 1,
    prop: 'bill',
    location: 'san diego'
  }, {
    id: 11,
    prop: 'bright'
  }, {
    id: 12, //not in test2
    prop: 'something',
    location: 'NY'
  },
  {
    id: 13, //no "prop" in test2
    prop: 'something',
    location: 'NY'
  }
];
const test2 = [{
    id: 1,
    prop: 'casey'
  }, {
    id: '11',
    prop: 'candle'
  },
  {
    id: 13,
    something: false
  },
  {
    id: 100, // not in test
    prop: 'other'
  }
];
test.forEach(t => {
  const t2 = test2.find(t2 => t2.id == t.id);//=== for exact match
  if (t2)
    t.prop = t2.prop || t.prop;
});
console.log(test);


7 commentaires

Utilisation de Double Equals == est une mauvaise idée, une chaîne et des identifiants numériques indiscernables et fusionnés


@Marcin Ceci est fait avec but. Dans ce cas, ils devraient être indiscernables.


Ce n'est pas ça. L'intégrité de l'objet initial doit rester la même pour les propriétés qui ne sont pas copiées de l'objet entrant


Je veux que cela soit clair aussi pourquoi cela ne suffit pas. Votre solution dépend de la déclaration correspondant à une propriété que vous recherchez. Bien que ce qui précède correspond à l'objet entier. Ce qui est entrant doit remplacer s'il est moins ou plus. Quelles sont il ne doit pas être remplacé s'il n'y a pas de propriété primordiale correspondante. Et la solution ci-dessus est plus facile à lire surtout avec le principe de Kiss que vous avez suggéré plus tôt


Comme vous pouvez le voir à partir de l'extrait, test est mis à jour IFF ID correspondant (lâchement == ou exact === ) et la propriété ( pro ) existe dans test2 .


@Alexkudryashev, mais je ne veux pas que cela s'inquiète de toute propriété dans l'objet autre que de correspondre à l'ID. Les autres propriétés doivent être libres de changer.


C'est exactement ce que fait mon extrait.



0
votes

Fournir cette réponse à l'aide de la fonction MAP () de telle sorte qu'un objet puisse être défini sur une valeur de clé en premier. La réponse acceptée est courte et concise, mais cela peut avoir une valeur supplémentaire. xxx


0 commentaires