在树状结构中查找具有属性的第一个对象

时间:2015-11-11 00:00:37

标签: javascript recursion data-structures

我有这样的结构:

[{
  description: 'Beef Stew',
  complete: false,
  tasks: [{
    description: 'Cut vegetables',
    complete: false,
    tasks: [{
      description: 'Dice carrots',
      complete: false
    }, {
      description: 'Mince Garlic',
      complete: false
    }, {
      description: 'Prepare potatoes',
      complete: false,
      tasks: [{
        description: 'Peel potatoes',
        complete: false
      }, {
        description: 'Cut potatoes',
        complete: false
      }]
    }]
  }]
}]

在这种情况下,我正在寻找第一次出现没有完成任务的元素。在这种情况下,这意味着它应该是{ description: 'Dice carrots', completed: false }。这是我写的基本内容。 codepen here too

function next(steps) {
  return steps.reduce((r, step) => {
    return (step.tasks && step.tasks.length > 0 && !step.complete) ? next(step.tasks) : step;
  }, []);
}

这确实有一个很深的步骤,但它最终得到最后步骤。我怎样才能制作出能够获得第一个算法的算法?

2 个答案:

答案 0 :(得分:1)

我会使用Array.prototype.find()

mozilla网站提供了这个的polyfill实现。

将其应用于您的问题:

[HtmlTargetElement("input", Attributes = nameof(Wrap) + ", asp-for")]
[HtmlTargetElement("select", Attributes = nameof(Wrap) + ", asp-for")]
public class FormGroupWrapperTagHelper : TagHelper
{
    public FormGroupWrapperTagHelper(IHtmlGenerator generator)
    {
        Generator = generator;
    }

    [HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext ViewContext { get; set; }

    protected IHtmlGenerator Generator { get; }

    public ModelExpression AspFor { get; set; }
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        var generateValidationMessage = Generator.GenerateValidationMessage(ViewContext,
                                                                  AspFor.Name,
                                                                  message: null,
                                                                  tag: null,
                                                                  htmlAttributes: null);
.....
}

答案 1 :(得分:0)

我在Steps课程中得到了一个非常好的解决方案,因为如果有人在将来寻找答案的话。

class Steps {
  constructor(steps) {
    this.steps = steps;
    this.current = steps;
  }
  next(steps=this.steps) {
    for(let step of steps) {
      if (step.tasks instanceof Array && !step.complete) {
        return this.next(step.tasks);
      }
      return this.current = step;
    }
  }
}

这允许我递归地前进。