2017-10-10 2 views
1

Existe-t-il un moyen d'optimiser ce qui suit avec ES5/ES6?Optimisation du double pour .map/.filter/.reduce ou autre

var obj = []; 
var set; 
for (var key_s in data1) { 
    set = false; 
    for (var key_s2 in data2) { 
     if (data1[key_s].id === data2[key_s2].id) { 
      obj.push({'id': data1[key_s].id, 
         'key': data1[key_s].key, 
         'value': data2[key_s2].value}) 
      set = true; 
      break; 
     } 
    } 
    if (!set) 
     obj.push({'id': data1[key_s].id, 
        'key': data1[key_s].key, 
        'value': "EMPTY"}) 
} 

Je veux avoir un objet qui contient toutes les clés de data1 et si une paire a la même id comme celui data2, il devrait prendre sa value, sinon il devrait devenir 'EMPTY'. Ou peut-être est-il un moyen d'utiliser Object.assign avec des paramètres spéciaux ou quelque chose?

+1

Optimiser dans quel sens? Efficacité? Lisibilité? – Carcigenicate

+1

s'il vous plaît ajouter 'data1' et' data2' ainsi que le résultat souhaité. –

+0

Les deux tableaux sont-ils 'data1' et' data2'? – 4castle

Répondre

1

Vous pouvez utiliser Map pour data2 et utiliser Array#map avec data1 et la valeur possible de data2.

var map = new Map(data2.map(o => ([o.id, o]))), 
    obj = data1.map(({ id, key }) => ({ id, key, value: map.has(id) 
     ? map.get(id).value 
     : 'EMPTY' 
    })); 
0

Vous pouvez le faire avec Array#map, Array#find et Object.assign. En spécifiant le value dans le premier paramètre de Object.assign, vous pouvez définir une valeur par défaut pour être remplacée par l'objet de data2.

var obj = data1.map(obj1 => { 
    const obj2 = data2.find(obj2 => obj1.id === obj2.id); 
    return Object.assign({ value: 'EMPTY' }, obj1, obj2); 
}); 

En utilisant spread properties, que Object.assign pourrait être modifiée:

{ value: 'EMPTY', ...obj1, ...obj2 } 
+0

vous pouvez ajouter d'autres propriétés (indésirables) à partir des objets de' data2'. –

+0

@NinaScholz C'est vrai. Je viens de faire l'hypothèse qu'il n'y aurait pas d'autres propriétés, ou que cela n'aurait pas d'importance. Je préfère votre solution car elle ne itére pas 'data2' à chaque fois. – 4castle

0

Ceci est assez es6'ed. map sur data1, le .find retournera l'objet correspondant s'il en existe un ou retournera undefined. définissez key_s.value sur la valeur key_s2 ou "EMPTY", puis renvoyez l'objet key_s. Vous allez vous retrouver avec un tableau d'objets. Cela suppose que data1 et data2 sont des tableaux d'objets, c'est ainsi que votre exemple a été écrit, donc je me suis dit que c'était le cas.

let obj = data1.map(key_s => { 
    let newValue = data2.find(key_s2 => key_s.id === key_s2.id) 
    key_s.value = newValue ? newValue.value : "EMPTY" 
    return key_s 
}) 
})