首先我会尝试解释情况。
我有对象的类别数组,其中包含更深层次的对象,看起来像这样:
/*
Categories
Object variables legend:
n - name, u - ID, p - category picture,
s - sub categories
*/
var Categories = [
{n:'Category',u:1,p:'http://#',s:[{n:'Sub category',u:4,s:[{n:'Sub sub category',u:5,s:[],items:['sku','sku2']},{n:'Sub sub category 2',u:6,s:[],items:['sku','sku2']},{n:'Sub sub category 3',u:7,s:[],items:['sku','sku2']}],items:['sku','sku2']},{n:'Sub category',u:4,s:[{n:'Sub sub category',u:5,s:[]},{n:'Sub sub category 2',u:6,s:[]},{n:'Sub sub category 3',u:7,s:[]}]},{n:'Sub category',u:4,s:[{n:'Sub sub category',u:5,s:[]},{n:'Sub sub category 2',u:6,s:[]},{n:'Sub sub category 3',u:7,s:[]}]}],items:['sku','sku2']},
{n:'Category',u:2,p:'http://#',s:[{n:'Sub category',u:8,s:[{n:'Sub sub category',u:9,s:[],items:['sku','sku2']},{n:'Sub sub category 2',u:10,s:[],items:['sku','sku2']},{n:'Sub sub category 3',u:11,s:[],items:['sku','sku2']}],items:['sku','sku2']}],items:['sku','sku2']},
{n:'Category',u:3,p:'http://#',s:[{n:'Sub category',u:12,s:[{n:'Sub sub category',u:13,s:[],items:['sku','sku2']},{n:'Sub sub category 2',u:14,s:[],items:['sku','sku2']},{n:'Sub sub category 3',u:15,s:[],items:['sku','sku2']}],items:['sku','sku2']}],items:['sku','sku2']}
];
所以基本上是子类别,可以有无限的深度。现在我需要编写一个函数来返回项目的值,当我提供 ID(即 u)时。
我应该如何实现这一点,如果我知道深度是多少,我可以编写多个“for”循环,但我不知道。
是否有某种过滤功能可以适应这项任务?
最佳答案
第一个观察结果是您的 Categories 对象有点不规则。 Categories 是一个规则的对象,看起来像一个数组,而子类别都是数组。
这将使它更容易使用:
var Categories = [
{n:'Category',u:1,p:'http://#',s:[{n:'Sub category',u:4,s:[{n:'Sub sub category',u:5,s:[],items:['sku','sku2']},{n:'Sub sub category 2',u:6,s:[],items:['sku','sku2']},{n:'Sub sub category 3',u:7,s:[],items:['sku','sku2']}],items:['sku','sku2']},{n:'Sub category',u:4,s:[{n:'Sub sub category',u:5,s:[]},{n:'Sub sub category 2',u:6,s:[]},{n:'Sub sub category 3',u:7,s:[]}]},{n:'Sub category',u:4,s:[{n:'Sub sub category',u:5,s:[]},{n:'Sub sub category 2',u:6,s:[]},{n:'Sub sub category 3',u:7,s:[]}]}],items:['sku','sku2']},
{n:'Category',u:2,p:'http://#',s:[{n:'Sub category',u:8,s:[{n:'Sub sub category',u:9,s:[],items:['sku','sku2']},{n:'Sub sub category 2',u:10,s:[],items:['sku','sku2']},{n:'Sub sub category 3',u:11,s:[],items:['sku','sku2']}],items:['sku','sku2']}],items:['sku','sku2']},
{n:'Category',u:3,p:'http://#',s:[{n:'Sub category',u:12,s:[{n:'Sub sub category',u:13,s:[],items:['sku','sku2']},{n:'Sub sub category 2',u:14,s:[],items:['sku','sku2']},{n:'Sub sub category 3',u:15,s:[],items:['sku','sku2']}],items:['sku','sku2']}],items:['sku','sku2']}
]
递归解决方案:
function searchRecursive(needle, haystack) {
for (var i=0; i<haystack.length; i++) {
if (haystack[i].u === needle) return haystack[i];
var search = searchRecursive(needle, haystack[i].s);
if (search) return search;
}
return null;
}
// Usage:
searchRecursive(10, Categories) // Object {n: "Sub sub category 2", u: 10, s: Array[0], items: Array[2]}
非递归解决方案:
function search(needle, haystack) {
var queue = haystack.slice();
while (queue.length) {
var current = queue.shift();
if (current.u === needle) return current;
queue = queue.concat(current.s);
}
return null;
}
// Usage:
search(10, Categories) // Object {n: "Sub sub category 2", u: 10, s: Array[0], items: Array[2]}
关于javascript - 如何在未知深度的物体中找到值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21457197/