[英]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.