如何在函数内使用array.push

时间:2019-01-23 01:08:23

标签: javascript arrays algorithm

我正在尝试将符合两个if语句的数字数组返回给数组。提示来自leet代码“ Self Divdiving Numbers”,并要求输入两个参数,即下限和上限,并检查该范围内的每个数字是否可被每个单独数字的数字整除。

当我console.log(num)(注释掉的部分时,我得到了正确的数字列表,但不是数组格式。要解决此问题,我想添加一个变量,结果并在推入数组后返回结果会在for循环内产生结果。但是,当我这样做时,我只会得到数组中的第一个正确术语,而不是整个数组。

如何解决?我曾尝试将return语句移动到各个位置,但这并不能解决问题。

该函数应返回[1、2、3、4、5、6、7、8、9、11、12、15、22];

function selfDividingNumbers(left, right) {

    for (let j = left; j <= right; j++) {
        let num = j;
        let result = []
        let strNum = num.toString();
        let dividingDigit = 0;

        for (let i = 0; i < strNum.length; i++) {
            if (num % parseInt(strNum[i]) == 0) {
                dividingDigit++;
            }
            if (dividingDigit == strNum.length) {
                result.push(num)
                //console.log(num)
            }
        }
        return result
    }
};

console.log(selfDividingNumbers(1, 22));

2 个答案:

答案 0 :(得分:0)

从预期的输出中,在函数的非常顶部处定义result,然后仅在完全迭代两个循环之后返回:

function selfDividingNumbers(left, right) {
  let result = []
  for (let j = left; j <= right; j++) {
    let num = j;
    let strNum = num.toString();
    let dividingDigit = 0;

    for (let i = 0; i < strNum.length; i++) {
      if (num % parseInt(strNum[i]) == 0) {
        dividingDigit++;
      }
      if (dividingDigit == strNum.length) {
        result.push(num)
        //console.log(num)
      }
    }
  }
  return result
};

console.log(selfDividingNumbers(1, 22));

为简洁起见,您可以使用.filter检查.every位数字是否均匀划分:

function selfDividingNumbers(left, right) {
  return Array.from(
    { length: right - left },
    (_, i) => i + left
  )
  .filter((num) => {
    const digits = String(num).split('');
    if (digits.includes(0)) {
      return false;
    }
    return digits.every(digit => num % digit === 0);
  });
}
console.log(selfDividingNumbers(1, 22));

答案 1 :(得分:0)

在for循环中声明let result = []时,您是在告诉您的代码,每次循环迭代时都要重新创建此数组,从而删除所有先前推入其中的结果。相反,您需要将其移到for循环之外以阻止这种情况的发生。

最后,仅在外部for循环完成后才需要return,因为在for循环中返回将停止函数的运行(并因此停止循环)。

请参见下面的工作示例:

function selfDividingNumbers(left, right) {
  let result = [];
  for (let j = left; j <= right; j++) {
    let num = j;

    let strNum = num.toString();
    let dividingDigit = 0;

    for (let i = 0; i < strNum.length; i++) {
      if (num % parseInt(strNum[i]) == 0) {
        dividingDigit++;
      }
      if (dividingDigit == strNum.length) {
        result.push(num)
      }
    }

  }
  return result
};

console.log(selfDividingNumbers(1, 22));