2015-11-01 180 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>