2016-06-20 5 views
2

Ich suche nach einer Lösung, um ein JSON-Objekt zu finden, das einen Wert in b enthält. Beispiel: Finde Objekte, die in b "jinx" enthalten.Underscore JS, finde ein Objekt, das einen Wert im Array enthält

Beispieldaten. [{ -ID: 1 a: "Karma", b: [ "verhexen", "caitlyn", "tristana"] }, { ....}, { ....}]

Ich verstehe, Unterstreichung funktioniert besser für Schlüssel/Wert-Paare, aber das wäre eine große Hilfe.

Danke.

+0

Es ist unklar, Beispieldaten eine Variable also was ist mit sample_data [b] .indexOf ("jinx"), wenn es -1 zurückgibt bedeutet es b enthält keine jinx –

+0

lass mich das ausprobieren und updaten. Danke –

+0

Ich habe in Antwort geschrieben, was ich meine :) weil es vielleicht nicht klar genug im Kommentar :) –

Antwort

1

Dies wird Ihnen ein Array out von Objekten, die alle Elemente aus Array enthält in wo b das Element jinx enthält: Hier

var in = [...]; 

var out = _.filter(in, function(item) { 
    return _.contains(item.b, 'jinx'); 
}); 
+0

Lassen Sie mich das ausprobieren und updaten. danke –

+0

funktioniert, danke! nur beschweren ist, dass es ein Array von Objekten und nicht nur das Objekt zurückgibt. irgendeine Idee? Antwort = [Objekt] anstelle von nur Objekt. –

+0

Wenn Sie nur am ersten Ergebnis interessiert sind, ersetzen Sie '_.filter' durch' _.find'. – Timo

1

ist meine Antwort in reinen js:

if(sample_data['b'].indexOf("jinx") != -1){ 
    console.log("Object in b contains jinx"); 
} 

Wenn Sie müssen ältere Browser unterstützen Sie können diese Polyfill verwenden

Array.prototype.indexOf || (Array.prototype.indexOf = function(d, e) { 
    var a; 
    if (null == this) throw new TypeError('"this" is null or not defined'); 
    var c = Object(this), 
     b = c.length >>> 0; 
    if (0 === b) return -1; 
    a = +e || 0; 
    Infinity === Math.abs(a) && (a = 0); 
    if (a >= b) return -1; 
    for (a = Math.max(0 <= a ? a : b - Math.abs(a), 0); a < b;) { 
     if (a in c && c[a] === d) return a; 
     a++ 
    } 
    return -1 
}); 
EDIT

:

Da Sie die Daten so aussehen

data=[{ id:1 ,a:"karma", b:["jinx","caitlyn","tristana"] }, {1:2}, {1:2}] 
//between 1 and a you forgot , 

Dann, was Sie verwenden, ist

if(data[0]['b'].indexOf("jinx") != -1){ 
    console.log("Object in b contains jinx"); 
} 
2

Underscore.js hat eine .contains() Verfahren das könnte in diesem Fall nützlich. Wenn Sie bei der Suche die b Schlüssel des Objekts nur besorgt sind, dann würde folgende Arbeiten:

var sampleData = { id:1, a:"karma", b:["jinx","caitlyn","tristana"] }; 

if (_.contains(sampleData.b, 'jinx') { 
    // Found 
} else { 
    // Not found 
} 

Basierend auf Ihren Kommentar hier ist eine überarbeitete Version. Dies verwendet die .filter-Methode von Underscore, um das Array nach denen zu filtern, die jink im b -Schlüsselfeld enthalten.

var sampleData = [ 
    { id:1, a:"karma", b:["jinx","caitlyn","tristana"] }, 
    { id:2, a:"karma", b:["kinx","caitlyn","tristana"] }, 
    { id:3, a:"karma", b:["linx","caitlyn","tristana"] }, 
    { id:4, a:"karma", b:["minx","caitlyn","tristana"] }, 
    { id:5, a:"karma", b:["ninx","caitlyn","tristana"] }, 
    { id:6, a:"karma", b:["jinx","caitlyn","tristana"] }, 
    { id:7, a:"karma", b:["pinx","caitlyn","tristana"] }, 
    { id:8, a:"karma", b:["qinx","caitlyn","tristana"] }, 
    { id:9, a:"karma", b:["rinx","caitlyn","tristana"] } 
]; 

var findJinx = function(data) { 
    return _.first(_.filter(data, function(item) { 
    if (_.contains(item.b, 'jinx')) { 
     return item; 
    } 
    })); 
} 

console.log(findJinx(sampleData)); 
+0

das würde für ein einzelnes Objekt funktionieren, aber ich habe vergessen zu erwähnen, dass meine Daten ein Array ist. var sampleData = [{id: 1, a: "karma", b: ["jinx", "caitlyn", "tristana"]}, {...}, {...}] –

+0

funktioniert, danke! nur beschweren ist, dass es ein Array von Objekten und nicht nur das Objekt zurückgibt. irgendeine Idee? Antwort = [Objekt] anstelle von nur Objekt. –

+0

Sie erwarten also nur eine einzige Instanz des gesuchten Wortes? Das heißt, nur eines der Objekte enthält 'jinx' –

2

Wenn Sie underscore verwenden möchten, können Sie _.each Schleife durch die Liste der Objekte verwenden, dann _.indexOf verwenden, um jedes b array in jedem Objekt zu prüfen, wie so: http://jsfiddle.net/rkamelot6262/BwHxv/378/

+0

wie, wie Sie die Daten "gebaut". Vielen Dank. –