J'essaie d'organiser mon objet actuel, qui ressemble à ce qui ressemble au-dessous donc j'ai cet objet, les deux premiers identifiés sont les mêmes mais ils ont obtenu différents organes. Je veux être capable de les rejoindre pour les rassembler. Où l'objet ressemble à quelque chose comme ceci: p> J'ai un jsfidle Ici , où je reçois un peu un résultat. Peut-il être fait mieux, plus propre. Est-ce que je l'ai approché correctement? P> p>
5 Réponses :
Vous pouvez utiliser p> réduire () code>
var myValues = [
{
client: "FIRE",
firstname: "Test",
id: "test@fire.com",
arrangeid: "FIREFOX",
region: "FOP",
secondname: "Testy",
status: "Approved"
},
{
client: "FIRE",
firstname: "Test",
id: "test@fire.com",
arrangeid: "BUZZZZZZ",
region: "FOP",
secondname: "Testy",
status: "Approved"
},
{
client: "PANTER",
firstname: "Panty",
id: "panty@panter.com",
arrangeid: "PANTER",
region: "PAN",
secondname: "mc panty",
status: "Approved"
},
{
client: "BAT",
firstname: "Bruce",
id: "bat@bat.com",
arrangeid: "BLACKBAT",
region: "BLK",
secondname: "Wyne",
status: "Approved"
}
]
let res = JSON.parse(JSON.stringify(myValues)).reduce((ac,a) => {
let ind = ac.findIndex(x => x.id === a.id);
a.arrangeid = [a.arrangeid];
ind === -1 ? ac.push(a) : ac[ind].arrangeid.push(...a.arrangeid);
return ac;
},[])
console.log(res);
Vous pouvez utiliser Réduire Code> Strong> , p> objet.values () code>
strong> et Syntaxe Srever Syntaxe comme ceci: {
"FIRE": {
"client": "FIRE",
"firstname": "Test",
"id": "test@fire.com",
"arrangeid": [ "FIREFOX", "BUZZZZZZ" ],
"region": "FOP",
"secondname": "Testy",
"status": "Approved"
},
"PANTER": {
"client": "PANTER",
"id": "panty@panter.com",
"arrangeid": [
"PANTER"
],
...
}
...
}
Vous pouvez créer une carte pour enregistrer les objets par leur identifiant, puis remplir les tableaux code> arrangez code>:
p>
const myValues = [{client: "FIRE",firstname: "Test",id: "test@fire.com",arrangeid: "FIREFOX",region: "FOP",secondname: "Testy",status: "Approved"},{client: "FIRE",firstname: "Test",id: "test@fire.com",arrangeid: "BUZZZZZZ",region: "FOP",secondname: "Testy",status: "Approved"}, {client: "PANTER",firstname: "Panty",id: "panty@panter.com",arrangeid: "PANTER",region: "PAN",secondname: "mc panty",status: "Approved"},{client: "BAT",firstname: "Bruce",id: "bat@bat.com",arrangeid: "BLACKBAT",region: "BLK",secondname: "Wyne",status: "Approved"}]; const map = new Map(myValues.map(o => [o.id, {...o, arrangeid: []}])); myValues.forEach(o => map.get(o.id).arrangeid.push(o.arrangeid)); const result = [...map.values()]; console.log(result);
Pour les ensembles de données plus importants, vous pouvez utiliser les capacités de recherche d'un objet p> cartographique code> pour collecter tous les éléments de chaque identifiant, puis vous pouvez convertir ce résultat dans le format souhaité. Vous pouvez exécuter cet extrait pour voir le résultat.
function collectByField(data, key, prop) {
const collection = new Map();
for (const obj of data) {
let item = collection.get(obj[key]);
if (item) {
// add this item's property to the array
item[prop].push(obj[prop]);
} else {
// put a copy of our object into the Map
// convert prop to an array with one initial item in it
let copy = Object.assign({}, obj);
copy[prop] = [obj[prop]];
collection.set(obj[key], copy);
}
}
// now use the Set to create final array output
return Array.from(collection.values());
}
let myValues = [
{
client: "FIRE",
firstname: "Test",
id: "test@fire.com",
arrangeid: "FIREFOX",
region: "FOP",
secondname: "Testy",
status: "Approved"
},
{
client: "FIRE",
firstname: "Test",
id: "test@fire.com",
arrangeid: "BUZZZZZZ",
region: "FOP",
secondname: "Testy",
status: "Approved"
},
{
client: "PANTER",
firstname: "Panty",
id: "panty@panter.com",
arrangeid: "PANTER",
region: "PAN",
secondname: "mc panty",
status: "Approved"
},
{
client: "BAT",
firstname: "Bruce",
id: "bat@bat.com",
arrangeid: "BLACKBAT",
region: "BLK",
secondname: "Wyne",
status: "Approved"
}
];
console.log(collectByField(myValues, "id", "arrangeid"));
Voici une approche légèrement plus générique, ce qui vous permet de grouper par n'importe quelle combinaison de champs, puis de fusionner des informations données dans un tableau:
p>
const pick = (fields, obj) => fields.reduce((o, fld) => ({...o, [fld]: obj[fld]}), {}) const groupAndMerge = (groupFields, mergeFields, xs) => Object.values(xs.reduce( (a, x, _, __, key = JSON.stringify(pick(groupFields, x))) => (a[key] = (a[key] || []).concat(x)) && a, {} )).map(xs => ({ ...xs[0], ...mergeFields.reduce((a, f) => ({...a, [f]: xs.map(x => x[f])}), {}) })) const myValues = [{arrangeid: "FIREFOX", client: "FIRE", firstname: "Test", fid: "test@fire.com", region: "FOP", secondname: "Testy", status: "Approved"}, {arrangeid: "BUZZZZZZ", client: "FIRE", firstname: "Test", fid: "test@fire.com", region: "FOP", secondname: "Testy", status: "Approved"}, {arrangeid: "PANTER", client: "PANTER", firstname: "Panty", fid: "panty@panter.com", region: "PAN", secondname: "mc panty", status: "Approved"}, {arrangeid: "BLACKBAT", client: "BAT", firstname: "Bruce", fid: "bat@bat.com", region: "BLK", secondname: "Wyne", status: "Approved"}] const result = groupAndMerge(['client', 'id'], ['arrangeid'], myValues) console.log(result)