J'ai une structure dans laquelle le nombre d'arrangements peut varier: J'ai besoin de créer un nouveau tableau à partir de ceux-ci, dans lequel ce nouveau tableau est commandé en premier par les ID qui sont répété dans tous les tableaux, puis ceux qui ne sont pas répétés, devraient être quelque chose comme ceci: P> newArray = [
{local: {id: 1, name: 'local1'}},
{local: {id: 3, name: 'local3'}},
{local: {id: 5, name: 'local5'}},
{local: {id: 2, name: 'local2'}},
{local: {id: 4, name: 'local4'}}
]
3 Réponses :
convertir tous les matrices en objets pour une recherche rapide.
p>
const array1 = [{ local: { id: 1, name: 'local1' } }, { local: { id: 2, name: 'local2' } }, { local: { id: 3, name: 'local3' } }, { local: { id: 4, name: 'local4' } }, { local: { id: 5, name: 'local5' } } ]; const array2 = [{ local: { id: 1, name: 'local1' } }, { local: { id: 3, name: 'local3' } }, { local: { id: 3, name: 'local4' } }, { local: { id: 3, name: 'local5' } }, ]; const array3 = [{ local: { id: 1, name: 'local1' } }, { local: { id: 3, name: 'local2' } }, { local: { id: 3, name: 'local3' } }, { local: { id: 3, name: 'local5' } }, ]; const obj1 = array1.reduce((acc, item) => { acc[item.local.id] = item; return acc; }, {}); const obj2 = array2.reduce((acc, item) => { acc[item.local.id] = item; return acc; }, {}); const obj3 = array3.reduce((acc, item) => { acc[item.local.id] = item; return acc; }, {}); const result = { ...obj3, ...obj2, ...obj1 }; const output = []; const temp = []; for (let key in result) { if (obj1[key] && obj2[key] && obj3[key]) { output.push(result[key]); } else temp.push(result[key]); } console.log([...output, ...temp]);
Je le ferais comme ceci (peut ne pas être la solution optimale):
p>
/* Same Arrays as yours */ const array1=[{local:{id:1,name:"local1"}},{local:{id:2,name:"local2"}},{local:{id:3,name:"local3"}},{local:{id:4,name:"local4"}},{local:{id:5,name:"local5"}}],array2=[{local:{id:1,name:"local1"}},{local:{id:3,name:"local3"}},{local:{id:3,name:"local4"}},{local:{id:3,name:"local5"}}],array3=[{local:{id:1,name:"local1"}},{local:{id:3,name:"local2"}},{local:{id:3,name:"local3"}},{local:{id:3,name:"local5"}}]; function myFunc(arrays) { // All items, with duplicates const allItems = [].concat.apply([], arrays); // All IDs, without duplicates thanks to `Set` const allIDs = Array.from( allItems.reduce((set, item) => set.add(item.local.id), new Set()) ); // Helper function used for sorting const isInAllArrays = id => arrays.every( arr => arr.some(item => item.local.id === id) ); // Sort the IDs based on whether they are in all arrays or not allIDs.sort((a, b) => { const _a = isInAllArrays(a), _b = isInAllArrays(b); if (_a !== _b) return _a ? -1 : 1; return 0; }); // Map all IDs to the first element with this ID return allIDs.map(id => allItems.find(item => item.local.id === id)); } const newArray = myFunc([array1, array2, array3]); // Just for readability in the demo below console.log(JSON.stringify(newArray).split('},{').join('},\n{'));
1) Traverser tous les tableaux et construire un objet avec des touches telles que p> ID code> et la valeur incluent l'objet et maintenez également la fréquence de l'occurrence (compte).
2) Maintenant,
objet.values code> de l'objet ci-dessus et triez-les basé sur "Compte".
Vous obtiendrez les articles les plus fréquents en haut.
const sort = (...arrs) => {
const all = {};
arrs
.flat()
.forEach(
(obj) =>
(all[obj.local.id] =
obj.local.id in all
? { ...all[obj.local.id], count: all[obj.local.id].count + 1 }
: { ...obj, count: 1 })
);
return Object.values(all)
.sort((a, b) => b.count - a.count)
.map(({ count, ...rest }) => rest);
};
array1 = [
{ local: { id: 1, name: "local1" } },
{ local: { id: 2, name: "local2" } },
{ local: { id: 3, name: "local3" } },
{ local: { id: 4, name: "local4" } },
{ local: { id: 5, name: "local5" } },
];
array2 = [
{ local: { id: 1, name: "local1" } },
{ local: { id: 3, name: "local3" } },
{ local: { id: 3, name: "local4" } },
{ local: { id: 3, name: "local5" } },
];
array3 = [
{ local: { id: 1, name: "local1" } },
{ local: { id: 3, name: "local2" } },
{ local: { id: 3, name: "local3" } },
{ local: { id: 3, name: "local5" } },
];
console.log(sort(array1, array2, array3))
Pour le boîtier d'identification répété, quel élément de tous les tableaux que vous attendez d'être poussé dans la matrice de résultat.
La valeur du nom serait-elle la même pour tous les identifiants similaires?
Qu'est-ce que tu as essayé jusque-là? Avez-vous recherché votre problème? Je ne vois aucune tentative de code dans votre question. Bien que nous soyons tous impatients d'aider, il est également important de noter que le débordement de la pile n'est pas un service de codage. S'il vous plaît, montre-nous ce que vous avez essayé jusqu'à présent afin que nous puissions vous noter dans la bonne direction.