我有一个这样的嵌套对象:
let obj = {
_id: {},
person: {
$search: {
lname: true
},
_id: {},
fname: {},
soomething:{
$search: {
fname: true
},
}
},
code: {},
$search: {
mname: true
},
vnvEmpName: {}
}
我必须检索 $ search 键中的所有键,即使该对象包含多次出现的 $ search ,它应该返回其中的所有键,这是:
lname
fname
mname
我试过了:
function search(obj, id) {
var result = "";
// iterate the object using for..in
for (var keys in obj) {
// check if the object has any property by that name
if (obj.hasOwnProperty(keys) && typeof obj[keys] === 'object') {
// if the key is not undefined get it's value
if (obj[keys][id] !== undefined) {
result = (obj[keys][id])
} else {
// else again call the same function using the new obj value
console.log("reahced")
search(obj[keys], id)
}
}
}
return result;
}
console.log(search(obj, '$search'))
但我只获得了 $ search 的第一个实例下的密钥( lname )。请帮我把它迭代到最后。
答案 0 :(得分:0)
您可以检查密钥是否为$search
并获取该嵌套密钥或检查嵌套对象。
function getSearch(object, key) {
return Object.entries(object).reduce((r, [k, v]) => r.concat(
k === key
? Object.keys(v)[0]
: v && typeof v === 'object'
? getSearch(v, key)
: []
), []);
}
var object = { _id: {}, person: { $search: { lname: true }, _id: {}, fname: {}, soomething: { $search: { fname: true } } }, code: {}, $search: { mname: true }, vnvEmpName: {} };
console.log(getSearch(object, '$search'));

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)
您可以使用生成器创建迭代器函数,然后将其用于您的目的。这是一个示例代码:
let obj = { _id: {}, person: { $search: { lname: true }, _id: {}, fname: {}, soomething: { $search: { fname: true } } }, code: {}, $search: { mname: true }, vnvEmpName: {} };
//iterator function
function* iterate(obj, stack='') {
for (let property in obj) {
if (obj.hasOwnProperty(property)) {
if (typeof obj[property] == "object") {
yield *iterate(obj[property], stack + '.' + property);
} else {
yield [stack, property, obj[property]];
}
}
}
}
//using iterator function for searching
let searchkey = "$search"
for (let value of iterate(obj)) {
if(value[0].indexOf(searchkey) !== -1)
console.log(value);
}
我希望它有所帮助。
答案 2 :(得分:0)
你可以试试这个
let obj = {
_id: {},
person: {
$search : {
lname: true
},
_id: {},
fname: 'test',
soomething:{
$search: {
fname: true
},
}
},
code: {},
$search: {
mname: true
},
vnvEmpName: {}
}
var result;
function search(obj, id) {
// iterate the object using for..in
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key][id] !== undefined) {
result = (obj[key][id]);
return result;
} else {
// else again call the same function using the new obj value
console.log("reahced")
search(obj[key], id)
}
}
}
return result;
}
console.log(search(obj, 'lname'))