javascript - 为什么我的 removeNumbersLessThan 功能无法正常工作?
问题描述
我必须编写一个函数,该函数接受一个数字和一个对象,然后输入并返回一个已删除所有小于指定数字的数字的对象。
我在问题集中的前一个问题上完成了一个类似的功能,它做了相反的操作,removeNumbersGreaterThan。我所做的只是复制与上一个问题相同的代码,并将大于符号替换为小于符号,但由于某种原因,它并非在所有情况下都有效。
我已经尝试将其更改为小于或等于 <= 但这根本没有区别。不知道发生了什么!
function removeNumbersLessThan(num, obj) {
var i = 0;
while (i < Object.keys(obj).length) {
if (Object.values(obj)[i] < num) {
delete obj[Object.keys(obj)[i]]
}
i++;
}
return obj;
}
//test
var obj = {
a: 4,
b: 6,
c: 5,
d: 3
}
removeNumbersLessThan(7, obj)
console.log(obj)
//returns b:6 d:3 -- should return empty object
我注意到它无论如何都会返回第二个值。即使它小于 num 值。在向我的对象添加更多元素后,我注意到它跳过了对象中的所有其他元素。我还发现之前的相反功能起作用的原因是因为测试跳过了这些情况。在进一步调查后,它也有同样的问题。
解决方案
当您的循环从 中删除一个值时obj
,该键将不再从Object.keys
.
但是您仍然会增加i
计数器,因此每次从obj
.
您可以通过仅获取对象键一次并在删除属性之前存储它们来解决此问题:
function removeNumbersLessThan(num, obj) {
let keys = Object.keys(obj);
for (let key of keys) {
if (obj[key] < num) {
delete obj[key];
}
}
return obj;
}
//test
var obj = {
a: 4,
b: 6,
c: 5,
d: 3
};
removeNumbersLessThan(7, obj);
console.log(obj);
如果您不想改变对象,则可以复制所有大于或等于新对象的属性:
function removeNumbersLessThan(num, obj) {
let result = {};
for(let [key, value] of Object.entries(obj))
if(value >= num)
result[key] = value;
return result;
}
let obj = {
a: 4,
b: 6,
c: 5,
d: 3,
e: 8
};
console.log(removeNumbersLessThan(7, obj));
推荐阅读
- java - 如何,在开启wifi和移动网络的情况下,在android上是选择通过移动网络传输数据吗?
- node.js - next() 在中间件中的使用
- c# - 在 asp.net mvc 5 中具有不同控制器的独特 slug 路由
- php - Flutter Laravel:使用 Dio 和 ImagePicker 上传图片
- swift - Swift ui macOS 在特定 url 上打开一个新的 google chrome 窗口隐身
- oracle - 如何修改查询并在 WHERE 语句中添加 IF/ELSE
- excel - 在 Excel 工作表中创建一个按钮以添加具有用户给定标题的列
- python - Django静态文件href格式不正确
- python - openpyxl:DataValidation 不显示下拉菜单
- flutter - 如何将变量中的数据放入 TeXViewDocument (flutter_tex)