2015-11-01 99 views
0

我有一個json對象。我需要找到字符串,其中yes = 1並獲取有關它的信息(名稱,是....)。如何在節點js中做到這一點?在json樹節點中搜索js

{"1": {"name":'alex', 
     "yes":'1'}, 
"2": {"name":'andy', 
     "yes":'0'}} 

或者有什麼辦法可以在像mysql這樣的對象中進行搜索嗎?

+0

另一個問題,你對結果有什麼期待?你想得到第一個符合條件的條件,或者你想要一個匹配條件的對象數組? – fuyushimoya

+0

@fuyushimoya我想找到所有與yes = 1的對象,然後使用它的「名稱」,「是」和其他數據以及 –

+0

@fuyushimoya返回一個數組與兩個項目。將感謝這兩個變種 –

回答

0

假設你只想檢查對同一級別的屬性(即沒有嵌套的對象你也想遞歸搜索),你可以使用一個簡單的for-in循環並直接檢查屬性值。

var obj = { 
      "1": { 
        "name":'alex', 
        "yes":'1' 
       }, 
      "2": { 
        "name":'andy', 
        "yes":'0' 
       } 
      }; 

var results = {}; 

for (var key in obj) { 
    if (obj.hasOwnProperty(key) && obj[key].yes === "1"){ 
     results[key] = obj[key]; 
    } 
} 

console.log(results); // {"1": { "name": "alex", "yes": "1" }} 
+0

@Андрей_-_奇怪,我只是複製粘貼到控制檯,它似乎工作正常。你的輸出是什麼? –

+0

我從文件和JSON中獲取對象。解析它 –

+0

@Андрей_-_然後唯一的變化是不是將'obj'綁定到對象字面值,而是將它綁定到'JSON.parse'的返回值。類似於'var obj = JSON.parse(json_str);'。如果你分享你的輸出,錯誤和所有內容,它通常會有幫助。 –

0

如果你想香草javascript,下面也應該在node.js上工作。

var testObj = { 
 
    "1": { 
 
    "name":'alex', 
 
    "yes":'1' 
 
    }, 
 
    "2": { 
 
    "name":'andy', 
 
    "yes":'0' 
 
    }, 
 
    "3": { 
 
    "name": 'bvvpp', 
 
    "yes": '1' 
 
    } 
 
}; 
 

 
function covertCheckFunc(checker) { 
 
    return function convertChecker(target) { 
 
    var key; 
 
    for (key in checker) { 
 
     if (!target.hasOwnProperty(key)) { 
 
     continue; 
 
     } 
 
     // Single level 
 
     if (typeof target[key] === 'undefined' || 
 
      target[key] !== checker[key]) { 
 
     return false; 
 
     } 
 
    } 
 

 
    return true; 
 
    } 
 
} 
 

 
// Get the first matched item. Return `null` if none match. 
 
function getFirstMatch(checkObj, checker) { 
 
    
 
    // Convert a object to match to a match function. 
 
    if (Object.prototype.toString.call(checker) !== '[object Function]') { 
 
    checker = covertCheckFunc(checker); 
 
    } 
 

 
    var key; 
 
    for (key in checkObj) { 
 
    if (checkObj.hasOwnProperty(key) && 
 
     checker(checkObj[key])) { 
 
     return checkObj[key]; 
 
    } 
 
    } 
 

 
    return null; 
 
} 
 

 
// Get array of matched item. Return empty array if none match. 
 
function getArrayMatch(checkObj, checker) { 
 
    if (Object.prototype.toString.call(checker) !== '[object Function]') { 
 
    checker = covertCheckFunc(checker); 
 
    } 
 
    var keys = Object.keys(checkObj); 
 
    var arrayForm = keys.map(function(key) { 
 
    return checkObj[key]; 
 
    }); 
 

 
    return arrayForm.filter(checker);; 
 
} 
 

 
console.log(getFirstMatch(testObj, {"yes": '1'})); 
 
console.log(getArrayMatch(testObj, {"yes": '1'}));

如果你接受一些庫像Underscorelodash,它可以更簡單:

var testObj = { 
 
    "1": { 
 
    "name":'alex', 
 
    "yes":'1' 
 
    }, 
 
    "2": { 
 
    "name":'andy', 
 
    "yes":'0' 
 
    }, 
 
    "3": { 
 
    "name": 'bvvpp', 
 
    "yes": '1' 
 
    } 
 
}; 
 

 
var condition = { 
 
    "yes": '1' 
 
}; 
 

 
var firstMatch = _.findWhere(testObj, condition); 
 
var arrayMatch = _.filter(testObj, function(item) { 
 
    return _.isMatch(item, condition); 
 
}); 
 

 
console.log(firstMatch); 
 
console.log(arrayMatch);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>