我有一个json对象。我需要找到字符串,其中yes = 1并获取有关它的信息(名称,是....)。如何在节点js中做到这一点?在json树节点中搜索js
{"1": {"name":'alex',
"yes":'1'},
"2": {"name":'andy',
"yes":'0'}}
或者有什么办法可以在像mysql这样的对象中进行搜索吗?
我有一个json对象。我需要找到字符串,其中yes = 1并获取有关它的信息(名称,是....)。如何在节点js中做到这一点?在json树节点中搜索js
{"1": {"name":'alex',
"yes":'1'},
"2": {"name":'andy',
"yes":'0'}}
或者有什么办法可以在像mysql这样的对象中进行搜索吗?
假设你只想检查对同一级别的属性(即没有嵌套的对象你也想递归搜索),你可以使用一个简单的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" }}
@Андрей_-_奇怪,我只是复制粘贴到控制台,它似乎工作正常。你的输出是什么? –
我从文件和JSON中获取对象。解析它 –
@Андрей_-_然后唯一的变化是不是将'obj'绑定到对象字面值,而是将它绑定到'JSON.parse'的返回值。类似于'var obj = JSON.parse(json_str);'。如果你分享你的输出,错误和所有内容,它通常会有帮助。 –
如果你想香草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'}));
如果你接受一些库像Underscore或lodash,它可以更简单:
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>
另一个问题,你对结果有什么期待?你想得到第一个符合条件的条件,或者你想要一个匹配条件的对象数组? – fuyushimoya
@fuyushimoya我想找到所有与yes = 1的对象,然后使用它的“名称”,“是”和其他数据以及 –
@fuyushimoya返回一个数组与两个项目。将感谢这两个变种 –