首页 > 解决方案 > 为什么我的 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 值。在向我的对象添加更多元素后,我注意到它跳过了对象中的所有其他元素。我还发现之前的相反功能起作用的原因是因为测试跳过了这些情况。在进一步调查后,它也有同样的问题。

标签: javascriptobject

解决方案


当您的循环从 中删除一个值时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));


推荐阅读