【问题标题】:How to avoid running two loops if I need the result from the first loop in JS如果我需要 JS 中第一个循环的结果,如何避免运行两个循环
【发布时间】:2021-04-25 07:46:09
【问题描述】:

我在 Javascript 中有一个数组,我需要对数组进行循环以找到最小整数,结果需要遍历所有值。 例如:[1,2,3,4,5]

然后我需要使用这个整数在这个数组中做另一个操作。所以我需要再次执行 for 循环,并执行以下操作:if(i === 1){ //do something }。问题是我不能在我的第一个循环中执行此操作,因为我需要在执行进一步操作之前遍历它们。

那么,问题是,如何避免在 javascript 中编写两个循环而不是一个循环?

【问题讨论】:

  • 有后面带数字的代码示例吗?
  • Math.min.apply(this, [1,2,3,4,5]) === 1
  • i = 1 是一个作业。这听起来像是学术上的吹毛求疵,但 === 之间的区别浪费了开发人员一生的努力。
  • 如果你需要知道最小值来执行第二个操作,那么你几乎必须循环遍历数组两次(我计算了Math.min的应用,或.map.find.reduce 等中的任何一个作为循环)。
  • @mbojko 这实际上取决于第二个操作是什么。假设他需要找出数组中最小值的位置,他实际上不需要再次循环。

标签: javascript arrays for-loop foreach


【解决方案1】:

在给定数据的 cmets 中,您可以通过单个循环减少数组并选择具有最小 key 值的对象。

这只对未排序的数组或排序未知的数组有意义。

var array = [{ key: "1", value: "apple" }, { key: 2, value: "orange" }, { key: "3", value: "lemon" }],
    min = array.reduce((a, b) => +a.key < +b.key ? a : b);

console.log(min.value);

【讨论】:

    【解决方案2】:

    没有通用的答案可以用来避免“循环两次”。有些问题可能只需要您这样做。但是,对于您的具体问题,它可以在一个循环中解决。这是一个非常简单的例子。

    let arr = [
      {
        "key": "1",
        "value": "apple"
      },
      {
        "key": "2",
        "value": "orange"
      },
      {
        "key": "3",
        "value": "lemon"
      }
    ];
    
    let minObj = arr[0];
    for (let i = 1; i < arr.length; i++) {
      if (+minObj.key > +arr[i].key) {
        minObj = arr[i];
      }
    }
    console.log(minObj);

    当然有很多方法可以做到这一点。

    【讨论】:

      【解决方案3】:

      问题是我不能在我的第一个循环中执行此操作,因为我需要在执行进一步操作之前遍历它们。

      你是对的。由于必须遍历数组,因此无法同时执行这两种操作;

      • 确认一下最小值是多少
      • 再次遍历每个最小值

      这是一个示例,显示了每个所需的循环和一个突变,我们将所有最小值设置为 0

      const getMin = (arr) => Math.min(...arr) // First loop
      const mutateArrValues = (arr, value, mutation) => arr.map(ent => {
        if (ent === value) {
          return mutation(ent)
        }
        return ent
      }) // Second loop
      
      const exampleArr = [3, 5, 1, 8, 2, 1]
      
      const min = getMin(exampleArr)
      const mutatedArr = mutateArrValues(exampleArr, min, (v) => 0)
      
      console.log('min = ', min)
      console.log('mutatedArr = ', mutatedArr)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 2015-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多