我有一个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。
答案 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)
您的代码有两个问题,还有一些小问题:
array.slice()
返回已删除的项目,您必须按顺序收集它们。
解决方案:使用array.slice()
将array.push()
返回的项目推到收集数组中。
array.slice()
修改数组。假设当前索引i
设置为7
,则切片操作会从35
中删除该项array
。但是现在下一个数字105
向下移动了一个位置。 for循环从索引8
开始,索引现在包含数字140
。
解决方案:删除项目后,修改for-loop索引。
slicedArray
的名称具有误导性。更好的名字是removedNumbers
。
变量removedNumbers
应该是函数removeNumber()
的局部变量。
使用全局变量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)