Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组中嵌套对象的角度递归函数_Javascript_Angular_Object_Ionic Framework_Nested - Fatal编程技术网

Javascript 数组中嵌套对象的角度递归函数

Javascript 数组中嵌套对象的角度递归函数,javascript,angular,object,ionic-framework,nested,Javascript,Angular,Object,Ionic Framework,Nested,我正在为以下结构构建自定义过滤管 [ { "client": { "name": "DJASLDJSAKL" }, "job_status": { "name": "Scheduled" }, "descriptor": "Lorem ipsum dolor sit amet consectetur adipiscing elit lacinia quam,

我正在为以下结构构建自定义过滤管

[
    {
        "client": {
            "name": "DJASLDJSAKL"
        }, 
        "job_status": {
            "name": "Scheduled"
        }, 
        "descriptor": "Lorem ipsum dolor sit amet consectetur adipiscing elit lacinia quam, ultrices leo interdum senectus integer ultricies venenatis nisl libero, et tellus nec litora volutpat proin duis neque. \r\n\r\nUt metus ac enim mauris malesuada bibendum lectus tincidunt nascetur phasellus, tristique quam libero purus dapibus nisl ultricies urna. \r\n\r\nNisl cubilia donec imperdiet nisi tempus venenatis cras egestas, duis senectus at orci ad porttitor in, magnis suspendisse sem ullamcorper neque tincidunt etiam.\r\n\r\nLitora pulvinar viverra et velit felis massa commodo etiam la.\r\n", 
        "duracion": {
            "text": "00:00:00" 
        }, 
        "tech": {
            "eta_promise_date": "Nov 20 2019 03:05:00:PM"
        }, 
        "siteAddress": "537 West Thomas Drive Rolling Meadows, IL 60008"
    }
]
我首先制作了一个只在第一级或顶层工作的函数。我有一个想法,但同时我有点迷路了,这就是我工作的方法

  findObject(obj, searchTerm){
   Object.keys(obj).forEach((key) => {
     //let r = RegExp(searchTerm, 'gi').test(obj[key]);
     if(obj === searchTerm){
       console.log(`key: ${key}, value: ${obj[key]}`);
       if(typeof obj[key] === 'object'){
         this.findObject(obj[key], searchTerm);
       }
       return null;
     }return null;

   });
  }
但我现在有一个无限循环

编辑并添加视图部分

    <ion-list *ngFor="let order of workOrders | filtro: searchTerm">
      <ion-item *ngFor = "let location of order.site" (click)="showOrderLocation(order)">
        <ion-icon name="pin" item-start [ngStyle]="{'color':order.job_status.color}"></ion-icon>
         <h4>{{order.code}}</h4><br>
         <p>{{order.job_status.name}}</p><br>
         <small>ETA: {{order.etaPromise}}</small><br>
         <small>Deadline: {{this.relativeDate(this.utcToLocalTime(order.tech.eta_promise_date))}}</small><br>
         <p>{{order.descriptor}}</p>
      </ion-item>
    </ion-list>

你的递归函数有点乱。findObject函数应根据对象的属性是否匹配searchTerm返回布尔值

使用Object.keysobj.forEach对值进行迭代是个坏主意,因为它会阻止您跳出递归,所以请改用简单的for循环。在您的例子中,有两种情况需要中断递归:string属性是否包含searchTerm,或者嵌套对象是否与searchTerm匹配


你的递归函数有点乱。findObject函数应根据对象的属性是否匹配searchTerm返回布尔值

使用Object.keysobj.forEach对值进行迭代是个坏主意,因为它会阻止您跳出递归,所以请改用简单的for循环。在您的例子中,有两种情况需要中断递归:string属性是否包含searchTerm,或者嵌套对象是否与searchTerm匹配


我将逻辑分为两种不同的方法,如下所示:

const data = [
    {...},
    {...},
    {...}
]

findObject(data: Array, searchTerm: string): Object {
   for (let obj of data) {
     if (this.contains(obj, searchTerm)) {
       return obj;
     }
   }
   return null;
}     

contains(obj: Object, searchTerm: string): boolean {
  for (let value of Object.values(obj)) {
    if (typeof value === 'object') {
      if (contains(value, searchTerm)) {
        return true;
      }
    } else if (value.includes(searchTerm)) {
      return true;
    }
  }
  return false;
}

我将逻辑分为两种不同的方法,如下所示:

const data = [
    {...},
    {...},
    {...}
]

findObject(data: Array, searchTerm: string): Object {
   for (let obj of data) {
     if (this.contains(obj, searchTerm)) {
       return obj;
     }
   }
   return null;
}     

contains(obj: Object, searchTerm: string): boolean {
  for (let value of Object.values(obj)) {
    if (typeof value === 'object') {
      if (contains(value, searchTerm)) {
        return true;
      }
    } else if (value.includes(searchTerm)) {
      return true;
    }
  }
  return false;
}

findObject的第一个参数是否真的是一个对象,因为它被命名为obj或上面指定的数组,一个典型的搜索词是什么样子的?除了递归问题,不要构建递归过滤管道。性能将非常糟糕。@uminder抱歉,是的,这是指定的数组,搜索词它是一个普通字符串,就像我找到了这个答案,并且工作得很好。findObject的第一个参数真的是一个对象吗,因为它名为obj或上面指定的数组,通常的搜索词是什么样子的?递归问题除外,不要构建递归过滤管道。性能将非常糟糕。@uminder抱歉,是的,它是指定的数组,搜索词它是一个普通字符串,就像我找到了这个答案,并且工作得很好。好的,我明白了,抱歉我没有放在视图端,我想显示结果,为此我必须返回相同的结构,我想也许我应该使用Object.entries?,我在添加视图部分时编辑了我的问题。在这种情况下,您需要做的就是返回obj而不是true,返回null而不是FALSE OK,我明白了,很抱歉我没有将视图放在一边,我想显示结果,为此我必须返回相同的结构,我想我可能应该使用Object.entries?,我通过添加视图部分来编辑我的问题。在这种情况下,您只需返回obj而不是true,返回null而不是false