javascript - filterRangeInPlace(arr, a, b) 获取数组 arr 并从中删除除 a 和 b 之间的值之外的所有值
问题描述
下面的功能很好用
function filterRangeInPlace(arr, a, b) {
for (let i = 0; i < arr.length; i++) {
let val = arr[i];
// remove if outside of the interval
if (val < a || val > b) {
arr.splice(i, 1);
i--;
}
}
}
arr=[2,3,4,5,6,7,1,0,2,12,11];
filterRangeInPlace(arr,1,5);
alert(arr);
但我想用 forEach 做同样的功能
let filterRange = (arr, a, b) => {
arr.forEach((item, i) => {
val=item;debugger;
if (val < a || val > b) {
arr.splice(i, 1);
i--;
}
})
}
arr=[2,3,4,5,6,7,1,0,2,12,11];
filterRange(arr,1,5);
alert(arr);
我试过了,但我无法得到正确的答案。它不像正常的迭代那样工作。有没有其他方法可以使用相同的foreach
解决方案
您不能使用 forEach 对数组进行就地修改,因为您无法控制在 forEach 中发生循环的索引
forEach 的一个简单实现就像
Array.prototype.forEach = function(cb) {
const arr = this;
for(var i = 0; i < arr.length; i++) {
cb.call(arr, arr[i], i, arr);
}
}
如果你看看上面的人,回调只是用 arr[i] 值调用,如果数组发生了变异,你将无法改变内部迭代器
对于像您这样的用例,您应该使用Array.prototype.filter
let filterRange = (arr, a, b) => {
return arr.filter((item, i) => {
val=item;
if (val < a || val > b) {
return false;
}
return true;
})
}
var arr=[2,3,4,5,6,7,1,0,2,12,11];
arr = filterRange(arr,1,5);
alert(arr);
推荐阅读
- request - 将图像从发布请求上传到云功能
- javascript - 打印时如何使用 JavaScript 或 CSS 在页脚中添加页码?
- apache - Websocket 连接失败:在收到握手响应之前连接已关闭
- ios - 着色器中的优化
- database - sqlite:导入文件不能存入内存
- angular - 在 Angular 中,如何使自定义组件具有应用了简单标志的 [(ngModel)]?
- javascript - 如何禁用按钮 - HTML/Javascript
- docker - 通过 docker 镜像运行时,Webpack 站点不会显示
- python - 有什么方法可以使用 python 将 Pdf 文件转换为 Docx
- ios - 从 Mac 读取 iPhone 日志文件内容