为什么此Javascript代码仅返回最后一个数字?

时间:2019-09-21 21:45:48

标签: javascript

我有一个Javascript数组,我想切片并放入一个新数组中,但是新数组仅输出最后一个值。

我尝试使用for循环

let array = [5, 6, 9, 7, 10, 17, 20, 35, 105, 140];
let slicedArray;
const removeNumbers = () => {
  for (let i = 0; i < array.length; i++) {
    if (array[i] % 5 === 0 && array[i] % 7 === 0) {
      slicedArray = [...array.splice(i, 1)];
    }
  }
  return slicedArray;
}

console.log(removeNumbers());

我希望输出35,105和140,但实际输出仅为140。

6 个答案:

答案 0 :(得分:1)

改为使用.filter,根据通过测试的另一个数组的元素创建一个新数组:

let array = [5, 6, 9, 7, 10, 17, 20, 35, 105, 140];
const newArr = array.filter(num => num % 5 === 0 && num % 7 === 0);
console.log(newArr);

如果还必须更改现有数组,则在拼接时将拼接元素推到新数组中(不要重新分配slicedArray,只需将其推入即可):

const array = [5, 6, 9, 7, 10, 17, 20, 35, 105, 140];
const removeNumbers = () => {
  const slicedArray = [];
  for (let i = 0; i < array.length; i++) {
    if (array[i] % 5 === 0 && array[i] % 7 === 0) {
      slicedArray.push(...array.splice(i, 1));
      // Need to subtract 1 from i here, so that this removed index gets iterated over again next time
      i--;
    }
  }
  return slicedArray;
}


console.log(removeNumbers());

7不包括在内,因为它不是5的倍数。

答案 1 :(得分:0)

根据if语句,您应该只能得到35、105和140。因为您希望数字可以被5和7整除。

问题是使用拼接方法时,您没有将数字附加到数组中并改变了数组。由于不包含突变号105,因此不包含在内。

let array = [5, 6, 9, 7, 10, 17, 20, 35, 105, 140];
let slicedArray = [];
const removeNumbers = () => {
  for (let i = 0; i < array.length; i++) {
    if (array[i] % 5 === 0 && array[i] % 7 === 0) {

      slicedArray = [...slicedArray, ...[...array].splice(i, 1)];

    }

  }

  return slicedArray;
}


console.log(removeNumbers());

答案 2 :(得分:0)

尝试像这样推送数组中的元素:

let array = [5,6,9,7,10,17,20,35,105,140];
let slicedArray;    
const removeNumbersTest = () => {
 for(let i = 0; i < array.length; i++){
   if(array[i] % 5 === 0 && array[i] % 7 === 0){
     slicedArray.push(...array.splice(i,1));
     }
   }
   return slicedArray;
}

上面的代码应该执行您想要的操作,只是在将数组中的元素压入之前检查逻辑。

希望有帮助!

答案 3 :(得分:0)

您只需将目标项目推入slicedArray:

let array =[5,6,9,7,10,17,20,35,105,140];
const slicedArray=[];  //Array is mutable with const keyword
const removeNumbers= () =>{
    for(let i=0; i<array.length; i++){
        if(array[i] % 5 === 0 && array[i] % 7 === 0){

          slicedArray.push(array[i]);

         }

    }

    return slicedArray;
}


console.log(removeNumbers());

答案 4 :(得分:0)

您的代码有两个问题,还有一些小问题:

  1. array.slice()返回已删除的项目,您必须按顺序收集它们。
    解决方案:使用array.slice()array.push()返回的项目推到收集数组中。

  2. array.slice()修改数组。假设当前索引i设置为7,则切片操作会从35中删除该项array。但是现在下一个数字105向下移动了一个位置。 for循环从索引8开始,索引现在包含数字140
    解决方案:删除项目后,修改for-loop索引。

  3. slicedArray的名称具有误导性。更好的名字是removedNumbers

  4. 变量removedNumbers应该是函数removeNumber()的局部变量。

  5. 使用全局变量array并不完美。也许您想将代码更改为removeNumbers()接受参数。我从示例中省略了此修复程序。

固定解决方案如下:

(请注意i--,该索引用于修复索引以在下一个for循环迭代中再次测试相同的位置。)

let array = [5,6,9,7,10,17,20,35,105,140];

const removeNumbers = () => {
  let removedNumbers = [];

  for(let i=0; i<array.length; i++){
    if(array[i] % 5 === 0 && array[i] % 7 === 0) {

      removedNumbers.push(...array.splice(i--,1));

    }
  }
  return removedNumbers;
}

console.log("Removed numbers:", removeNumbers());
console.log("Remaining numbers:", array);

答案 5 :(得分:-1)

如果您期望7、35,105和140,则将其追加到列表中,然后将if更改为

if (array[i] % 7 === 0 && array[i] % 5 === 0)