我正在进行一个Javascript练习,它需要一个可以搜索数组中具有某个属性的对象的函数。如果存在这样的对象,则该函数应该删除该对象,然后返回该数组。如果数组中不存在此类对象,则该函数应返回一个字符串,表示该对象不存在。
到目前为止,我已经编写了下面的代码,以购物车为例,但我没有得到理想的结果。如果我在购物车[0]上搜索对象,它会按预期工作。但是,索引大于0的任何内容都会返回“该项目不在您的购物车中”。我做错了什么?
var cart = [{apples: 12}, {oranges: 20}, {grapes: 35}, {peaches: 18}]
function removeFromCart(item){
for (var i = 0; i < cart.length; i++){
if (cart[i].hasOwnProperty(item)) {
cart.splice(i, 1);
return cart;
}
else {
return "That item is not in your cart.";
}
}
}
答案 0 :(得分:1)
问题在于,在循环的第一次迭代中,如果if
条件不为真,它将立即执行else
条件和return
。在循环之后摆脱else
并将第二个return
语句移动到 - 这样,只有在检查每个项目后才会应用“未找到”条件。
var cart = [{apples: 12}, {oranges: 20}, {grapes: 35}, {peaches: 18}]
function removeFromCart(item){
for (var i = 0; i < cart.length; i++){
if (cart[i].hasOwnProperty(item)) {
cart.splice(i, 1);
return cart;
}
}
// not found:
return "That item is not in your cart.";
}
console.log(removeFromCart("grapes"));
顺便说一句,有时会返回一个数组的函数和其他时候返回一个字符串的函数可能会让人感到困惑。鉴于您的函数正在更新在函数外部定义的cart
变量,我更倾向于返回空字符串以获取成功,并返回错误字符串以便失败。
答案 1 :(得分:0)
希望这将是usefule
var cart = [{
apples: 12
}, {
oranges: 20
}, {
grapes: 35
}, {
peaches: 18
}]
function removeFromCart(item) {
cart.forEach(function(elem, index) {
if (elem.hasOwnProperty(item)) {
cart.splice(index, 1);
}
})
return cart; // return the array
}
console.log(removeFromCart('apples'))
在我的选项中,最好不要在循环中修改aan数组,事实上你可以使用过滤器函数,而无需修改原始数组,这可以重新生成
function removeFromCart(item) {
var _x = cart.filter(function(elem){
return !elem.hasOwnProperty(item)
})
return _x
}
console.log(removeFromCart('apples'))