2016-06-20 81 views
2

我正在尋找一種解決方案來查找包含b中值的json對象。例如:在b中查找包含「jinx」的對象。Underscore JS,查找包含數組中值的對象

示例數據。 [{ ID:1 一個: 「報應」, B:[ 「不祥」, 「凱特琳」, 「TRISTANA」] },{ ....},{ ....}]

我理解下劃線對鍵/值對更好,但這會有很大的幫助。

謝謝。

+0

目前還不清楚,樣本數據一個變量如此sample_data [b] .indexOf(「jinx」),如果它返回-1它意味着b不包含jinx –

+0

讓我試試這個和更新。謝謝 –

+0

我已發佈回答我的意思:)因爲它可能不夠清楚在評論:) –

回答

1

這會給你一個包含從陣列in其中b包含元素jinx所有項目對象的數組out

var in = [...]; 

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

讓我試試並更新。謝謝 –

+0

作品,謝謝!只有抱怨是它返回一個對象數組而不僅僅是對象。任何想法?響應= [對象]而不是對象。 –

+0

如果您只對第一個結果感興趣,請用'_.find'替換_.filter。 – Timo

1

這是我在純JS回答:

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

如果你需要支持舊版瀏覽器,你可以使用這個polyfill

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 
}); 

編輯:

既然你說你的數據是這樣的

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

然後你用的是

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

Underscore.js有.contains()的方法,可在這種情況下非常有用。如果你只關心你的搜索對象的b鍵,然後下面將工作:

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

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

基於您的評論這裏是一個修訂版。這使用下劃線的.filter方法將數組過濾到b -keyed數組中的jink

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

這將工作的單個對象,但我忘了提及我的數據是一個數組。 var sampleData = [{id:1,a:「karma」,b:[「jinx」,「caitlyn」,「tristana」]},{...},{...}] –

+0

作品,謝謝!只有抱怨是它返回一個對象數組而不僅僅是對象。任何想法?響應= [對象]而不是對象。 –

+0

所以你只希望找到你正在搜索的單詞的單個實例?意思只有一個對象將包含'jinx' –

2

如果你想使用underscore,您可以使用_.each循環通過你的對象列表,然後使用_.indexOf檢查每個b array中的每個對象,像這樣: http://jsfiddle.net/rkamelot6262/BwHxv/378/

+0

就像你「建立」數據一樣。謝謝。 –

相關問題