Kim*_*lan 2 javascript arrays recursion
我需要一个javascript递归函数,当key和JavaScript对象传递给这个函数时返回一个值数组.
请注意,嵌套的JavaScript对象具有未知深度.该函数工作正常,但它返回重复.
function getValuesByKey(object, key) {
var values = [];
recursiveFx(object);
function recursiveFx(object) {
for (var property in object) {
if (object.hasOwnProperty(property)) {
if (typeof object[property] == "object") {
recursiveFx(object[property]);
} else {
//found a property which is not an object
try {
if (isDefined(object[key])) {
console.log('Here is the value that is to be pushed',object[key]);
values.push(object[key]);
}
} catch (e) {
}
}
}
}
}
return values;
}
Run Code Online (Sandbox Code Playgroud)
这是isDefined辅助函数
function isDefined(variable) {
try {
if (typeof(variable) !== 'undefined') return true;
} catch (e) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
以下是JavaScript对象的示例:
{
"children": [{
"id": "5",
"parentid": "0",
"text": "Device Guides",
"index": "1",
"children": [{
"id": "10",
"index": "0",
"text": "Grandstream GXP-21XX"
}, {
"id": "11",
"index": "1",
"text": "Polycom Soundstation/Soundpoint"
}, {
"id": "23",
"parentid": "8",
"index": "2",
"text": "New Polycom",
"children": [{
"id": "5",
"parentid": "0",
"text": "Device Guides",
"index": "1",
"children": [{
"id": "10",
"index": "0",
"text": "Grandstream GXP-21XX"
}, {
"id": "11",
"index": "1",
"text": "Polycom Soundstation/Soundpoint"
}, {
"id": "23",
"index": "2",
"text": "New Polycom"
}]
}, {
"id": "6",
"parentid": "0",
"text": "Pre-Sales Evaluation",
"index": "0",
"children": []
}, {
"id": "7",
"parentid": "0",
"text": "Router Setup Guides",
"index": "2",
"children": [{
"id": "9",
"index": "0",
"text": "Sonicwall"
}, {
"id": "12",
"index": "1",
"text": "Cisco"
}]
}]
}, {
"id": "6",
"parentid": "0",
"text": "Pre-Sales Evaluation",
"index": "0",
"children": []
}, {
"id": "7",
"parentid": "0",
"text": "Router Setup Guides",
"index": "2",
"children": [{
"id": "9",
"index": "0",
"text": "Sonicwall"
}, {
"id": "12",
"index": "1",
"text": "Cisco"
}]
}]}]};
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,getValuesByKey(jsonObj, 'id');我得到以下数组:
["5", "5", "5", "5", "10", "10", "10", "11", "11", "11", "23", "23", "23", "23", "5", "5", "5", "5", "10", "10", "10", "11", "11", "11", "23", "23", "23", "6", "6", "6", "6", "7", "7", "7", "7", "9", "9", "9", "12", "12", "12", "6", "6", "6", "6", "7", "7", "7", "7", "9", "9", "9", "12", "12", "12"]
Run Code Online (Sandbox Code Playgroud)
请注意,5已返回4次而不是2次
小智 7
您正在检查key 每次通过对象属性的循环的存在.因此,您获得的值与对象上的属性一样多.所以:
function getValuesByKey(object, key) {
var values = [];
recursiveFx(object);
function recursiveFx(object) {
if (key in object) values.push(object[key]);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
for (var property in object) {
if (object.hasOwnProperty(property)) {
if (typeof object[property] == "object") {
recursiveFx(object[property]);
}
}
}
}
return values;
}
Run Code Online (Sandbox Code Playgroud)
JSON.stringify与替代品一起使用无论如何,你可以更容易地做到这一点
function getValuesByKey(object, key) {
var values = [];
JSON.stringify(object, function(k, v) {
if (k === key) values.push(v);
return v;
});
return values;
}
Run Code Online (Sandbox Code Playgroud)
这使用replacer参数来JSON.stringify截取每个键值对.字符串化的值本身我们不需要扔掉.