2015-10-25 2 views
-3

I ont une matrice comme celle-ci:transformation/manipulation matrice

array1=[{value:1, label:'value1'},{value:2, label:'value2'}, {value:3, label:'value3'}] 

I ont un second réseau de nombre entier:

array2=[1,3] 

je voudrais obtenir cette matrice sans boucle pour:

arrayResult = ['value1', 'value3'] 

Est-ce que quelqu'un sait comment le faire avec javascript?

Merci à l'avance

+2

ce que vous avez essayé jusqu'à présent? – 1252748

+0

Quel est le point de votre champ de valeur dans array1? est-ce toujours l'indice + 1? Si oui, vous n'en avez pas besoin et pourriez simplement avoir array1 = ['value1', 'value2', ...] – clocksmith

+0

La description n'indique pas ce que array2 représente – charlietfl

Répondre

2

sur la carte les éléments array2 à la propriété label de l'élément en array1 avec le correspondant value:

array2      // Take array2 and 
    .map(     // map 
    function(n) {   // each element n in it to 
     return array1   // the result of taking array1 
     .find(    // and finding 
      function(e) {  // elements 
      return   // for which 
       e.value  // the value property 
       ===   // is the same as 
       n;   // the element from array2 
      } 
     ) 
     .label    // and taking the label property of that elt 
     ; 
    } 
) 
; 

Sans commentaires, et ES6:

array.map(n => array1.find(e => e.value === n).label); 
+0

merci, c'est exactement ce que je cherchais – bokzor

+0

@bokzor Note '.find' est une nouvelle méthode et n'est pas supportée dans IE, https://goo.gl/blSYko –

+0

Oui. Mais je préfère le premier. Mais merci quand même :-) – bokzor

1

Vous pouvez utiliser .filter et .map, comme celui-ci

var array1 = [ 
 
    {value:1, label:'value1'},{value:2, label:'value2'}, {value:3, label:'value3'} 
 
]; 
 

 
var array2 = [1, 3]; 
 

 
var arrayResult = array1.filter(function (el) { 
 
    return array2.indexOf(el.value) >= 0; 
 
}).map(function (el) { 
 
    return el.label; 
 
}); 
 

 
console.log(arrayResult);

0

Un for-loop simple devrait suffire pour cela. À l'avenir, vous devriez sérieusement écrire du code pour montrer ce que vous avez essayé.

var array1=[{value:1, label:'value1'},{value:2, label:'value2'}, {value:3, label:'value3'}]; 
var array2=[1,3]; 
var result = []; 

for (var i = 0; i < array2.length; i++){ 
    result.push(array1[array2[i]-1].label); 
} 
console.log(result); //["value1", "value3"] 

JSBIN

0

Bonne réponse à tous. Si je peux suggérer une autre alternative en utilisant Map car cela semble être adapté à une solution de clé: paire de valeurs.

var arr1 = [ {value:1, label:'value1'}, {value:2, label:'value2'}, {value:3, label:'value3'} ]; 
var arr2 = [1, 3]; 

// create a Map of the first array making value the key. 
var map = new Map(arr1.map (a => [a.value, a.label])); 

// map second array with the values of the matching keys 
var result = arr2.map(n => map.get (n)); 

Bien sûr, cela suppose que la clé: la structure de la valeur du premier réseau ne deviendra pas plus complexe, et pourrait être écrit sous la forme plus simple de.

var arr1 = [[1,'value1'], [2,'value2'], [3,'value3']]; // no need for names 
var arr2 = [1, 3]; 

var map = new Map(arr1); // no need to arr1.map ; 
var result = arr2.map(n => map.get (n)); 
0

Juste index le premier tableau en utilisant la fonction _.indexBy:

var indexedArray1 = _.indexBy(array1, "value"); 
_.map(array2, function(x) { return indexedArray1[x].label; });