2017-04-25 3 views
1

Gegeben ein Objekt der unten aufgeführten Formular, was ist der beste Weg, um Schlüssel zu erhalten, die einen bestimmten Wert enthalten? Wenn wir zum Beispiel in der folgenden Struktur alle Objekte haben wollen, die property1 besitzen, sollten wir object1 und object2 als Antwort erhalten. Oder kann dies in einer bestimmten Art von Datenstruktur für den schnellen Abruf gespeichert werden? Schleifen von Werten aller Objekte in einem Ansatz. Ich suche etwas schneller als das. Würde mich über Vorschläge freuen.Javascript-Filter von Werten

{ 
     object1: [property1, property2, property3], 
     object2: [property1], 
     object3: [property2] 
} 
+0

Trivial mit über alle Eigenschaften Looping und Überprüfung mit indexOf, wenn der Wert in Arrays enthalten ist. Wenn dies der Fall ist, drücken Sie den Schlüssel in das Ergebnis-Array. Sie können es selbst tun, zumindest versuchen Sie es. – dfsq

+0

Zeit Komplexität in diesem Fall wäre die Anzahl der Objekte + Anzahl der Schlüssel. Gibt es dafür einen besseren Ansatz? –

Antwort

0

Wenn Sie eine schnellere Datenstruktur für diesen Zweck wollen, dann können Sie Ihr Objekt in eine ES6 Karte drehen, wie folgt aus:

// Sample object: 
 
var obj = { 
 
    key1: [1, 2, 3], 
 
    key2: [1], 
 
    key3: [2] 
 
}; 
 

 
// Turn into map keyed by values 
 
var m = Object.keys(obj).reduce((m, key) => 
 
    obj[key].reduce((m, v) => m.set(v, (m.get(v) || []).concat(key)), m), 
 
    new Map 
 
); 
 

 
// Example use of the map: 
 
console.log('1 occurs in: ', m.get(1));

0

so etwas wie dieses

x = { 
 
     object1: ['property1', 'property2', 'property3'], 
 
     object2: ['property1'], 
 
     object3: ['property2'] 
 
} 
 

 
z = Object.keys(x).filter(function(y) { 
 
    return x[y].indexOf('property1') !== -1 
 
}) 
 
console.log(z)

Try This nur Schleifen und filtert jede Taste in Ihrem Objekt und dann tut eine Gleichheitsprüfung auf dem Array von Werten. Kinda

0
var l = []; 
var dict = {...} 
for (var key in dict) { 
    var obj = dict[key]; 
    if (obj.indexOf("property1") != -1) { 
     l.push(obj); 
    } 
} 

l // Here is the result 
0

Verwenden Sie einfach die filter() Funktion über Object.keys(data) und prüfen, ob jedes Objekt den Wert enthält. Sie können auch die Schlüssel zum Wert selbst map(), wenn das was Sie wollen.

const data = { 
 
    a: [1,2,3], 
 
    b: [1], 
 
    c: [2] 
 
}; 
 

 
const searchValue = 1; 
 

 
const keysWithValue = Object.keys(data).filter(key => data[key].includes(searchValue)); 
 

 
const objectsWithValue = keysWithValue.map(key => data[key]); 
 

 
console.log(keysWithValue, objectsWithValue);

0

Schleife durch das Array und testen jedes Mal mit diesem:

if(Obj.hasOwnProperty("<property name>")){ 
array.push(obj); 
} 
return array; 
0

überprüfen diesen Code, ich denke, es wird Ihnen helfen:

const list = { 
 
     object1: ['a', 'b', 'c'], 
 
     object2: ['a'], 
 
     object3: ['c'] 
 
} 
 

 
function getData(list, value){ 
 
    return Object.keys(list).filter(item => list[item].indexOf(value) !== -1) 
 
} 
 

 
getData(list, 'a');