[英]How to find value within objects of unknown depth?
Firstly I will try to explain situation. 首先,我将尝试解释情况。
I have categories array of objects which contains deeper objects and looks like this: 我有对象的类别数组,其中包含更深的对象,看起来像这样:
/*
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']}
];
So basically sub categories, can have unlimited depth.. Now I need to write a function which will return value of items, when I will provide ID (which is u). 因此,基本上子类别可以具有无限深度。现在,我需要编写一个函数,当我提供ID(即u)时,该函数将返回项目的值。
How should I achieve that, I could write multiple 'for' loops if I would know what the depth is, but I don't. 我应该如何实现,如果我知道深度是多少,我可以编写多个“ for”循环,但我不知道。
Is there some kind filtering function which I could adapt for this task? 有某种我可以适应此任务的过滤功能吗?
The first observation is that your Categories object is slightly irregular. 第一个观察结果是您的Categories对象有点不规则。 Categories is a regular object which looks like an array, while the sub-categories are all arrays. 类别是看起来像数组的常规对象,而子类别都是数组。
This would make it easier to work with: 这样可以更轻松地使用:
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']}
]
Recursive solution: 递归解决方案:
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]}
Non-recursive solution: 非递归解决方案:
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]}
You have not Array
of Objects
, you have Object
of Objects
. 您没有Objects
Array
,而有Object
Objects
。 You may need to change: 您可能需要更改:
var Categories = {
to: 至:
var Categories = [
Then you will need to iterate over your Array
recursivelly: 然后,您将需要递归遍历Array
:
function getU( obj, u ) {
var result = null;
for (var i = 0, len = obj.length; i < len; i++) {
if (obj[i].u === u) {
result = obj[i];
break;
}
}
if( result === null ) {
result = getU( obj[ i ].s, u)
}
return result;
}
and First time calling it like: 和第一次调用它是这样的:
getU( Categories, u);
Where u
is your ID you want to find. 其中u
是你的身份证,你想找到。
Now that you have a better format (more normalized data) your search becomes a lot easier: 现在您有了更好的格式(更规范的数据),搜索变得更加容易:
function getU(obj, u){
for (var i = 0, r; i < obj.length && !r; i++){
if (obj[i].u == u) return obj[i];
r = getU(obj[i].s, u);
}
return r;
}
So, for example : 因此, 例如 :
getU(Categories, 6)
// returns: {"n":"Sub sub category 2","u":6,"s":[],"items":["sku","sku2"]}
getU(Categories, 14)
// returns: {"n":"Sub sub category 2","u":14,"s":[],"items":["sku","sku2"]}
// and of course (upper-most node)
getU(Categories, 1)
// returns {"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"]}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.