2016-12-11 5 views
0

Ich habe 2 Arrays von Objekten: ArtikelListe und ArtikelFeeded. Alle Objekte in jedem Array haben die gleiche Struktur (Anzahl der Schlüssel/Werte). Einer dieser Schlüssel hat die gleiche 'Bedeutung', aber einen anderen Namen (item_id auf itemsList, id auf itemsFetched). Ihre Werte sind gleich.Filter und klonen Objekteigenschaften

Ich brauche die itemsList Array filtern und nur die Objekte lassen, die den item_id Wert gleich den id Wert auf itemsFetched. Kopieren Sie dann den Schlüssel/Wert count von jedem Objekt auf dem Array itemsFetched (das mit item_id = id übereinstimmt) zum gefilterten Array.

Ich habe einen funktionierenden Code, aber ich bin sicher, es ist nicht der beste Weg, um dieses Problem zu lösen. Ich habe schon vorher etwas Ähnliches gefragt (bezüglich des Filterteils), das mein Problem gelöst hat, aber da ich nach der Filterung den "Zähl" -Teil hinzufügen musste, habe ich das ganze Ding neu erfunden.

itemsList (Probe)

[ 
    { 
     "id": 0, 
     "name": "Egg", 
     "img": "http://www.serebii.net/pokemongo/items/egg.png" 
    }, 
    { 
     "id": 1, 
     "name": "Pokeball", 
     "img": "http://www.serebii.net/pokemongo/items/20pokeballs.png" 
    }, 
    { 
     "id": 2, 
     "name": "Greatball", 
     "img": "http://www.serebii.net/pokemongo/items/greatball.png" 
    }, 
    { 
     "id": 401, 
     "name": "Incense", 
     "img": "http://www.serebii.net/pokemongo/items/incense.png" 
    }, 
    { 
     "id": 901, 
     "name": "Incubator (Unlimited)", 
     "img": "http://www.serebii.net/pokemongo/items/eggincubator.png" 
    } 
] 

itemsFetched (Probe)

[ 
    { 
    "item_id": 1, 
    "count": 50, 
    "unseen": true 
    }, 
    { 
    "item_id": 401, 
    "count": 2, 
    "unseen": true 
    }, 
    { 
    "item_id": 901, 
    "count": 1, 
    "unseen": true 
    } 
] 

resultArray (was ich am Ende wollen)

[ 
    { 
    "id": 1, 
    "name": "Pokeball", 
    "count": 50, 
    "img": "http://www.serebii.net/pokemongo/items/20pokeballs.png", 
    }, 
    { 
    "id": 401, 
    "name": "Incense", 
    "count": 2, 
    "img": "http://www.serebii.net/pokemongo/items/incense.png" 
    }, 
    { 
    "id": 901, 
    "name": "Incubator (Unlimited)", 
    "count": 1, 
    "img": "http://www.serebii.net/pokemongo/items/eggincubator.png" 
    } 
] 

mein aktueller Code (Arbeits)

let arr = []; 
itemsFetched.forEach((item) => { 
    itemsList.forEach((item2) => { 
    if (item.item_id === item2.id) { 
     arr.push({ 
     "id": item.item_id, 
     "name": item2.name, 
     "count": item.count, 
     "img": item2.img 
     }); 
    } 
    }); 
}); 

PS: Ich bin in der Lage ES6/7 Syntax/Funktionen zu verwenden.

+0

Am besten ist es, diese Verarbeitung auf dem Server durchzuführen. Geben Sie immer Daten zurück, die für den Browser formatiert sind. Dann müssen Sie nicht auf jeder Seite, die diese Daten benötigt, dieselbe Datenmanipulation durchführen. – Luke101

+0

Ja, ich bin mir dessen bewusst. Dies geschieht serverseitig. Eines der Arrays befindet sich in einer JSON-Datei und dessen Art einer Vorlage, das andere ist eine Antwort auf einen externen API-Aufruf. – nip

+0

Er versucht, die ID von einem Array zu bekommen. hier --- >> if (itemsFetched.item_id === itemsList.id) –

Antwort

2

Sie Hash-Karte verwenden können Zeit complexitly zu reduzieren, Ihr Algorithmus ist O(m*n), Folgen ist O(m+n+r)

const itemsMap = itemsList.reduce((map, item) => { 
    map[item.id] = item 
    return map 
}, {}) 
const results = itemsFetched 
    .filter((item) => itemsMap.hasOwnProperty(item.item_id)) 
    .map((item) => ({ 
     id: item.item_id, 
     name: itemsMap[item.item_id].name, 
     count: item.count, 
     img: itemsMap[item.item_id].img, 
    })) 
+0

danke für die Eingabe. Ich werde das testen und sehen, wie es geht. (auch, Konsolen-Logging überall um zu verstehen, was los ist eheh) – nip

-1

Gefällt mir?

var itemsList = [ 
 
    { 
 
     "id": 0, 
 
     "name": "Egg", 
 
     "img": "http://www.serebii.net/pokemongo/items/egg.png" 
 
    }, 
 
    { 
 
     "id": 1, 
 
     "name": "Pokeball", 
 
     "img": "http://www.serebii.net/pokemongo/items/20pokeballs.png" 
 
    }, 
 
    { 
 
     "id": 2, 
 
     "name": "Greatball", 
 
     "img": "http://www.serebii.net/pokemongo/items/greatball.png" 
 
    }, 
 
    { 
 
     "id": 401, 
 
     "name": "Incense", 
 
     "img": "http://www.serebii.net/pokemongo/items/incense.png" 
 
    }, 
 
    { 
 
     "id": 901, 
 
     "name": "Incubator (Unlimited)", 
 
     "img": "http://www.serebii.net/pokemongo/items/eggincubator.png" 
 
    } 
 
]; 
 

 
var itemsFetched = [ 
 
    { 
 
    "item_id": 1, 
 
    "count": 50, 
 
    "unseen": true 
 
    }, 
 
    { 
 
    "item_id": 401, 
 
    "count": 2, 
 
    "unseen": true 
 
    }, 
 
    { 
 
    "item_id": 901, 
 
    "count": 1, 
 
    "unseen": true 
 
    } 
 
] 
 

 

 

 
let arr = []; 
 
itemsFetched.forEach((item) => { 
 
    itemsList.forEach((item2) => { 
 
    if (item.item_id == item2.id) { 
 
     arr.push({ 
 
     "id": item.item_id, 
 
     "name": item2.name, 
 
     "count": item.count, 
 
     "img": item2.img 
 
     }); 
 
    } 
 
    }); 
 
}); 
 

 
console.log(arr);

+0

Wie ist das besser? – 4castle

+0

Was ?? Mein Code funktioniert. Ich möchte nur wissen, ob es einen besseren Weg gibt, es zu tun, anstatt 2 für jedes verschachtelt + wenn + drücken. (vielleicht sollte ich hinzufügen, dass ich immer noch die ES6/7-Funktionen/Syntax und Array-bezogene Funktionen wie .filter, .map, .includes lerne) – nip

+0

Entschuldigung, aber Sie Code funktioniert nicht dafür: if (itemsFetched.item_id === itemsList.id), weil Sie versuchen, ID aus einem Array zu bekommen -_- –

0

Eine Möglichkeit ist, zu verbessern for..of Anweisung anstelle forEach für die innere Schleife zu verwenden. Dies hilft beim Verlassen der Schleife, sobald die ID übereinstimmt. Es gibt keinen direkten Weg, um für jede Methode zu brechen.

let arr = []; 
itemsFetched.forEach((item) => { 
    for (let item2 of itemsList) { 
    if (itemsFetched.item_id === itemsList.id) { 
     arr.push({ 
     "id": itemsFetched.item_id, 
     "name": itemsList.name, 
     "count": itemsFetched.count, 
     "img": itemsList.img 
     }); 
     break; 
    } 
    } 
}); 
+0

Du meintest 'for ... of', was ES6 Syntax ist. – gyre

+0

@gyre ja ~ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...von –

1

for ... of eine Schleife (eine Funktion ES6) in Verbindung mit Array#map Gebrauch.

Dies erleichtert das zusammengeführte Objekt return viel einfacher, wenn Sie das erste Mal eine Übereinstimmung finden, die eine logische Optimierung ist, da keine Liste mehr als einen Eintrag mit einem gegebenen id enthalten sollte.

const result = itemsFetched.map(data => { 
    for (let item of itemsList) { 
    if (data.item_id === item.id) { 
     return { 
     id: item.id, 
     name: item.name, 
     count: data.count, 
     img: item.img 
     } 
    } 
    } 
}) 

Snippet:

const itemsList = [{ 
 
    "id": 0, 
 
    "name": "Egg", 
 
    "img": "http://www.serebii.net/pokemongo/items/egg.png" 
 
}, { 
 
    "id": 1, 
 
    "name": "Pokeball", 
 
    "img": "http://www.serebii.net/pokemongo/items/20pokeballs.png" 
 
}, { 
 
    "id": 2, 
 
    "name": "Greatball", 
 
    "img": "http://www.serebii.net/pokemongo/items/greatball.png" 
 
}, { 
 
    "id": 401, 
 
    "name": "Incense", 
 
    "img": "http://www.serebii.net/pokemongo/items/incense.png" 
 
}, { 
 
    "id": 901, 
 
    "name": "Incubator (Unlimited)", 
 
    "img": "http://www.serebii.net/pokemongo/items/eggincubator.png" 
 
}] 
 

 
const itemsFetched = [{ 
 
    "item_id": 1, 
 
    "count": 50, 
 
    "unseen": true 
 
}, { 
 
    "item_id": 401, 
 
    "count": 2, 
 
    "unseen": true 
 
}, { 
 
    "item_id": 901, 
 
    "count": 1, 
 
    "unseen": true 
 
}] 
 

 

 
const result = itemsFetched.map(data => { 
 
    for (let item of itemsList) { 
 
    if (data.item_id === item.id) { 
 
     return { 
 
     id: item.id, 
 
     name: item.name, 
 
     count: data.count, 
 
     img: item.img 
 
     } 
 
    } 
 
    } 
 
}) 
 

 
console.log(result)

+0

Zuerst, danke für die Eingabe. Ich habe angefangen, .map anzuschauen, aber ich wusste nicht ... von .... Ich schaue mir das an. Auch wenn dies eine "vernünftige Größe Webapp" wäre, würden diese Änderungen die Leistung des Servers verbessern, besonders die für ... von Teil, da es nach dem Finden einer Übereinstimmung bricht? Wenn ja, wäre das bemerkbar? Oder nur ein kleines Detail? – nip

+0

Je länger Ihre Liste erhält, desto wichtiger ist der Unterschied in der Leistung. Da es so eine schnelle Lösung ist, würde ich lieber auf der sicheren Seite sein und sofort zurückkehren, wenn ein Spiel gefunden wird. – gyre

+0

Verstanden. Habe gerade deine Suggestion implementiert und es funktioniert. Vielen Dank ! – nip