为什么我的removeNumbersLessThan函数不能正常工作?

时间:2019-08-01 19:48:29

标签: javascript object

我必须编写一个函数,该函数需要一个数字和一个对象,然后输入并返回一个删除了所有小于指定数字的数字的对象。

我对问题集中的上一个问题完成了一个类似的功能,即相反的功能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值。 将更多元素添加到对象后,我注意到它跳过了对象中的所有其他元素。 我还发现先前相反功能起作用的原因是因为测试跳过了这些情况。经进一步调查,它也有同样的问题。

4 个答案:

答案 0 :(得分:2)

当循环从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));

答案 1 :(得分:1)

您对对象进行了变异,并在每个循环中使用了一个已删除的属性,在此花瓶中插入了一个新的长度,索引在前面。

建议不要使用此解决方案,因为每次迭代都会获得新的键和值。

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]];
        } else {
            i++; // increment only if not deleted
        }
    }
    return obj;
}

var obj = { a: 4, b: 6, c: 5, d: 3 };

removeNumbersLessThan(7, obj);
console.log(obj); // {}

相反,您可以使用for ... in statement来获取密钥。然后用此键检查。

function removeNumbersLessThan(num, object) {
    for (let key in object) {
        if (object[key] < num) {
            delete object[key];
        }
    }
    return object;
}

var obj = { a: 4, b: 6, c: 5, d: 3 };

removeNumbersLessThan(7, obj);

console.log(obj); // {}

答案 2 :(得分:1)

首先,请注意,当删除对象上的key(即,对对象进行突变)时,length返回的数组的Object.keys()属性在每次迭代中都会减少,同时,您每次迭代都会增加i变量,因此最终您将不会遍历对象的所有属性。

在这种情况下,我更喜欢使用for ... in遍历对象键,而不是while循环,使用下一个逻辑:

function removeNumbersLessThan(num, obj)
{
    for (const key in obj)    
    {
        if (obj[key] < num)
            delete obj[key];
    }

    return obj;
}

console.log(removeNumbersLessThan(7, {a:4, b:6, c:5, d:3}));
console.log(removeNumbersLessThan(5, {a:4, b:6, c:5, d:3}));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

答案 3 :(得分:0)

使用缩小版本...

function removeNumbersLessThan(num, obj) {
  return Object.keys(obj).reduce((accum, next) => {       
        if (obj[next] >= num)
          return {...accum, [next]: obj[next]};
        else
          return accum;
  },{});
}

      //test
      var obj = {
        a:4,
        b:6,
        c:5,
        d:3
      } 

let x = removeNumbersLessThan(7,obj);

console.log(x);