简体   繁体   English

如何在未知深度的物体中寻找价值?

[英]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.

相关问题 如何在 javascript 中的未知深度对象数组中找到特定属性值的最大深度? - How do I find the maximum depth of a particular property value in an array of objects of unknown depth in javascript? 如何导航未知深度的嵌套对象? - how to navigate nested objects of unknown depth? 在javascript中的对象内设置深度未知的属性值 - set a property's value with unknown depth within an object in javascript 建设性地操纵未知深度的JSON树中的任何值/对象 - Constructively manipulating any value/object within a JSON tree of unknown depth 在深度未知的嵌套数组中查找具有特定值的元素 - Find elements with specific value in a nested array with unknown depth 如何在数组中查找所有具有假值的对象? - How to find all objects with a false value within an array? 在具有未知键的对象数组中查找所有匹配元素 - Find all matching elements within an array of objects with unknown key 查找不同 JSON 对象内的平均值 - Find average value within different JSON objects 当他的深度未知时,如何在JavaScript Object中找到键? - How can I find key in JavaScript Object when his depth is unknown? 如何遍历树状未知深度的嵌套数据结构以查找和收集可寻址数组项? - How to traverse through a tree like nested data structure of unknown depth in order to find and collect addressable array items?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM