簡體   English   中英

為什么我的removeNumbersLessThan函數不能正常工作?

[英]Why is my removeNumbersLessThan function not working properly?

我必須編寫一個函數,該函數接受一個數字和一個對象,然后輸入並返回一個刪除了所有小於指定數字的數字的對象。

我在問題集中的上一個問題上完成了一個類似的功能,該功能相反,即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)); 

您對對象進行了變異,並在每個循環中使用已刪除的屬性在此花瓶中插入了一個新的長度,索引在前面。

建議不要使用此解決方案,因為每次迭代都會獲得新的鍵和值。

 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語句獲取密鑰。 然后用此鍵檢查。

 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); // {} 

首先,請注意,當刪除對象上的key (即對對象進行突變)時,由Object.keys()返回的數組的length屬性將在每次迭代中減小,同時在每個對象上增加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;} 

正在使用簡化版本...

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM