2017-10-17 9 views
0

j'ai les deux objets suivantsComparer deux objets et extraire ceux qui ont la même clé javascript

var productionTime= [ 
    {Rob3: 20}, 
    {Rob8: 100}, 
    {Rob4: 500}, 
    {Rob1: 100}, 
    {Rob5: 500} 
]; 
var Busytime= [ 
    {Rob4: 10}, 
    {Rob3: 200}, 
    {Rob8: 100}, 
    {Rob5: 200}, 
    {Rob1: 100} 
]; 

Maintenant, je veux diviser chaque élément « productionTime » par sa « des disponibilités en » respectives qui ont la même clé. Par exemple productionTime.Rob3 doit être divisé par BusyTime.Rob3 et productionTime.Rob8 doit être divisé par BusyTime.Rob8 et ainsi de suite.

Comment puis-je faire avec array.find() ou Array.filter() en javascript/nodejs?

P.S: Je sais que je peux le faire en utilisant deux boucles foreach imbriquées, mais qui est très lent, je suppose que

+0

Fixer les structures de données (comme 'var productionTime = {Rob3: 20, Rob8: 100, ...}') et votre algorithme se résume à une seule boucle for. – Phylogenesis

+0

la structure de données ne peut pas changer car il se peut que je doive ajouter d'autres clés à chaque objet. par exemple. var productionTime = [ {Rob3: 20, hasTime = "date ou heure"}, {Rob8: 100, hasTime = "date ou heure"}, {Rob4: 500, hasTime = "date ou heure"}, {Rob1: 100, hasTime = "date ou l'heure"}, { Rob5: 500, hasTime = "date ou l'heure"} ]; –

Répondre

2

Vous pouvez utiliser une table de hachage et une seule boucle pour chaque tableau.

var productionTime = [{ Rob3: 20 }, { Rob8: 100 }, { Rob4: 500 }, { Rob1: 100 }, { Rob5: 500 }]; 
 
    busytime = [{ Rob4: 10 }, { Rob3: 200 }, { Rob8: 100 }, { Rob5: 200 }, { Rob1: 100 }], 
 
    hash = Object.create(null); 
 

 
busytime.forEach(function (o) { 
 
    var key = Object.keys(o)[0]; 
 
    hash[key] = o[key]; 
 
}); 
 

 
productionTime.forEach(function (o) { 
 
    var key = Object.keys(o)[0]; 
 
    o[key] /= hash[key]; 
 
}); 
 

 
console.log(productionTime);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Simple et élégant – axelduch

0

Convertir les deux tableaux à l'objet en utilisant Object#assign et spread syntax. Obtenez les clés de l'un d'entre eux en utilisant Object#keys et parcourez les clés en utilisant Array#map. Créer un nouvel objet pour chaque clé à l'aide shorthand property names:

const productionTime = [{"Rob3":20},{"Rob8":100},{"Rob4":500},{"Rob1":100},{"Rob5":500}]; 
 
const Busytime= [{"Rob4":10},{"Rob3":200},{"Rob8":100},{"Rob5":200},{"Rob1":100}]; 
 

 
// create objects from both arrays 
 
const productionTimeObj = Object.assign({}, ...productionTime); 
 
const busytimeObj = Object.assign({}, ...Busytime); 
 

 
// get the keys from one of the objects, and iterate with map 
 
const result = Object.keys(productionTimeObj).map((key) => ({ 
 
    // create a new object with the key, and the result of the division 
 
    [key]: productionTimeObj[key]/busytimeObj[key] 
 
})); 
 

 
console.log(result);