【问题标题】:jQuery iterate through array of objects recursively and return a valuejQuery递归遍历对象数组并返回一个值
【发布时间】:2016-05-19 00:53:50
【问题描述】:

我有以下 json 表示网站上的页面,这些页面通过 items 数组具有子页面,该数组当前包含 2 个顶级项目 - 关于和服务:

var data = '[{"id":107,"name":"About Us","route":"page","slug":"about","parent":0,"module":1,"items":[{"id":118,"name":"About Sub Page","route":"page","slug":"about-sub-page","parent":107,"items":[]}]},{"id":129,"name":"Services","route":"page","slug":"services","parent":0,"module":1,"items":[{"id":174,"name":"Services sub page","route":"page","slug":"services-sub-page","parent":129,"items":[]}]}]';

我正在尝试编写一个函数,它递归地遍历对象数组(data = JSON.parse(data))并识别顶级项目的索引。例如,在我的函数中,如果我使用“about”slug,它将返回 0,“about-sub-page”也将返回 0。同样,“services-sub-page”将返回 1。

我现在有这个:

data = JSON.parse(data);

function check(slug,data) {
 var result;
 $.each(data, function(index){
  if (this.slug === slug) {
    result = index;
    return false;
  }
  else {
   check(slug,this.items);
  }
 });
   return result;
 }

如果我通过一个顶级的 slug,这很好用,例如

 var index = check('about',data);
 console.log(index); // returns 0

 var index = check('services',data);
 console.log(index); // returns 1

但是,如果我尝试使用子页面,我会得到未定义

 var index = check('services-sub-page',data);
 console.log(index); // returns undefined

我相信我需要返回 false 以跳出每个循环,但不确定为什么当我尝试递归使用该函数时它不起作用。

【问题讨论】:

  • 你应该这样做result = check(slug, this.items);,否则当它落入子项时你肯定会返回未定义(那个 else 子句被击中)。
  • 嗨,詹姆斯,试过这个 - 仍然不确定?

标签: javascript jquery arrays recursion


【解决方案1】:

您可以使用Array#some(),因为如果满足条件,它将停止迭代。

var data = '[{"id":107,"name":"About Us","route":"page","slug":"about","parent":0,"module":1,"items":[{"id":118,"name":"About Sub Page","route":"page","slug":"about-sub-page","parent":107,"items":[]}]},{"id":129,"name":"Services","route":"page","slug":"services","parent":0,"module":1,"items":[{"id":174,"name":"Services sub page","route":"page","slug":"services-sub-page","parent":129,"items":[]}]}]';

function check(slug, data) {
    function iter(a, i) {
        if (a.slug === slug || Array.isArray(a.items) && a.items.some(iter)) {
            index = i;
            return true;
        }
    }

    var index,
        array = JSON.parse(data);

    array.some(iter)
    return index;
}

document.write(check('about', data) + '<br>');
document.write(check('services', data) + '<br>');
document.write(check('services-sub-page', data) + '<br>');

【讨论】:

    【解决方案2】:

    数据 = JSON.parse(数据);

    功能检查(slug,数据){

    变量结果;

    $.each(数据,函数(索引){

    if (this.slug === slug) {

    result = index;
    
    return false;
    

    }

    否则 {

    结果 = 检查(slug,this.items); // 赋值给结果变量

    }

    });

    返回结果;

    }

    【讨论】:

    • 只需将 check(slug,this.items); 分配给结果变量
    • 嗨 Sams(和 James) - 已经实现了这个,但仍未定义?
    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2016-06-22
    • 2013-03-02
    相关资源
    最近更新 更多