2017-06-20 1 views
1

im mit diesem Problem mit, die ich um meinen Kopf wickeln kann nicht,ein Array von Objekten filtern und seine Eigenschaft extrahieren, indem eine Reihe von Tasten

viel besser, wenn in einem Code zu setzen.

//Array of objects sample 
var objects = [{id:1, name:'test1'}, {id:2, name:'test2'}, {id:3, name: 'test3'}, {id:4, name:'test4'}]; 
var arrayOfKeys = [3,1,4]; 

//extract object name property if its id property is equivalent to one of arrayOfKeys [3,1] 
//var arrayOfKeys = [3,1,4]; 
//output sample: extractedName=['test3','test1','test4']; 

Ich habe Filter und Karte, aber ohne Erfolg, auch Verschachtelung Filter innerhalb der Karte im immer eine Anordnungen von Array und innen versucht, ein einzelnes Objekt.

+1

Ich verstehe genau nicht, was wollen Sie – geo

+0

Gehst zu werden die Namen immer 'testN' wo' N' eine Zahl? –

+0

@ibrahimmahrir ja, seine kontinuierliche, auch ich füge eine andere ID zu ArrayOfKeys es sollte immer noch die Id-Eigenschaft des Objekts entsprechen –

Antwort

2

Sie können die Objekte zuordnen und die gewünschten Schlüssel zuordnen, um den Namen abzurufen.

var objects = [{ id: 1, name: 'test1' }, { id: 2, name: 'test2' }, { id: 3, name: 'test3' }], 
 
    arrayOfKeys = [3, 1], 
 
    result = arrayOfKeys.map((map => id => map.get(id).name)(new Map(objects.map(o => [o.id, o])))); 
 
    
 
console.log(result);

+0

Schön und prägnant! – trincot

+1

Aber imho, schrecklich zu lesen und zu verstehen ... – Andreas

+0

@Andreas Ich werde nicht zustimmen müssen. Ihre Antworten sind immer sehr effizient und ich lerne immer etwas Neues aus ihrem Code. – Rick

0

Ich nehme an, Sie Array Zahlen id Eigenschaften zuordnen müssen? Hier ist der Code, wo Sie map durch Zahlen und find in Ihrem Array Situationen zu handhaben, wenn es keinen solchen id in Objekte Array:

var objects = [{id:1, name:'test1'}, {id:2, name:'test2'}, {id:3, name: 'test3'}]; 
 
var arrayOfKeys = [3,1]; 
 

 
var res = arrayOfKeys.map(key => { 
 
    var found = objects.find(o => o.id == key); 
 
    return found ? found.name : false; 
 
}) 
 

 
console.log(res)

0

let objects = [{id:1, name:'test1'}, {id:2, name:'test2'}, {id:3, name: 'test3'}, {id:4, name:'test4'}], 
 
    arrayOfKeys = [3,1,4]; 
 

 
let result = objects.reduce((res, obj) => { // loop over the array of objects 
 
    let index = arrayOfKeys.indexOf(obj.id);  // check if the current object's id is in the array of keys 
 
    if(index !== -1) {       // if it's there 
 
    res.push(obj.name);      // then add the current object's name to the result array 
 
    arrayOfKeys.splice(index, 1);    // remove its id from the array of keys so we won't search for it again (optional, slightly better than leaving it there) 
 
    } 
 
    return res; 
 
}, []); 
 

 
console.log(result);

0

Ich glaube, Sie waren mit dem Filter auf dem richtigen Weg. Sie können es mit einigen lesbar und prägnant machen.

var objects = [{id: 1,name: 'test1'}, {id: 2,name: 'test2'}, {id: 3,name: 'test3'}, {id: 4,name: 'test4'}], 
 
arrayOfKeys = [3, 1, 4]; 
 

 
var result = objects.filter((x, i) => { 
 
    if (arrayOfKeys.some(k => x.id === k)) { 
 
    return true; 
 
    } 
 
}) 
 
console.log(result.map(x=>x.name));

Etwas noch kürzer! wäre

var objects = [{id: 1,name: 'test1'}, {id: 2,name: 'test2'}, {id: 3,name: 'test3'}, {id: 4,name: 'test4'}],arrayOfKeys = [3, 1, 4]; 
 

 
var result = objects.filter((x, i) => arrayOfKeys.some(k => x.id === k)); 
 

 
console.log(result.map(x=>x.name));

Verwandte Themen