javascript - 如何在未知深度的物体中找到值(value)?

标签 javascript object

首先我会尝试解释情况。

我有对象的类别数组,其中包含更深层次的对象,看起来像这样:

/*
    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/

相关文章:

javascript - 如何使用ajax从一组函数中调用单个函数?

javascript - es6方法中函数内部This的值

java - 如何向对象添加值

java - 自动管理Java对象

javascript - 过滤数组时,JS 过滤器无法正常工作

javascript - 给定一个对象列表,如何只返回存在于所有对象中的那些属性?

javascript - es6 propertyIsEnumerable

javascript - Angular-UI Datepicker 最小日期设置与另一个日期

javascript - localStorage - clear() 或 removeItem()?

javascript - JQuery .on ("click") 在触摸设备上触发 "mouseover"