【问题标题】:Deleting an object from a array in javascript在javascript中从数组中删除一个对象
【发布时间】:2016-05-09 10:00:30
【问题描述】:

我正在尝试使用它的 art_id 从购物车中删除一个对象,但是当我收到此错误时 SyntaxError: Delete of an unqualified identifier in strict mode. 为什么会发生这种情况以及如何修改我的代码以解决此错误

 function remove_from_cart(req, res, next) {
        console.log(req.session);
        var art_id = req.params._id;

        var art_to_remove = _.findWhere(req.session.cart, {
            art_id: art_id
        });

        console.log(art_to_remove);
        delete art_to_remove;
        console.log(req.session);
        res.send('deleted')
    }

【问题讨论】:

标签: javascript node.js


【解决方案1】:

由于您似乎使用的是underscore,因此您可以使用_.reject()

req.session.cart = _.reject(req.session.cart, { art_id: art_id });

【讨论】:

    【解决方案2】:

    我收到此错误 SyntaxError: Delete of an unqualified 严格模式下的标识符。

    根据spec

    当删除运算符出现在严格模式代码中时,会出现 SyntaxError 如果 UnaryExpression 是对 变量、函数参数或函数名

    您需要使用拼接删除数组中的值而不是删除指向过滤值的变量(不允许)。

    或者使用下划线,也可以使用_findWhere获取获取值的索引

    var b = _.indexOf(req.session.cart, art_to_remove );
    req.session.cart.splice(b,1);
    

    一个简单的 JS 实现可能是

       req.session.cart = req.session.cart.filter(function(cart){
         return cart.art_id != art_id;
       })
    

    【讨论】:

    • 这里cart 是一个数组,应该可以从数组中删除项目(虽然不是正确的方法)? art_to_remove 既不是对变量、函数参数或函数名的直接引用
    • @sabithpocker art_to_remove 是一个变量。
    • 但这是对作为数组元素的对象的引用,它有资格在严格模式下被删除。请参阅this discussion,了解为什么将其设为Syntax Error 而不是Type Error
    • @sabithpocker 它仍然是一个变量。变量不会被删除。除了参考值,它们也有参考名称。只需尝试此var a = {}; delete a;,它将输出false,因为它不是允许的操作。
    【解决方案3】:

    您必须使用 Array.prototype.splice 而不是使用 Delete,因此您的代码应如下所示:

     function remove_from_cart(req, res, next) {
        console.log(req.session);
        var art_id = req.params._id;
    
        var art_to_remove = _.findWhere(req.session.cart, {
            art_id: art_id
        });
    
        console.log(art_to_remove);
        req.session.cart.splice(req.session.cart.indexOf(art_to_remove), 1);
        console.log(req.session);
        res.send('deleted')
    }
    

    【讨论】:

      【解决方案4】:

      我希望 req.session.cart 是一个不为空的数组对象,并且 req.params._id 不为空

      function remove_from_cart(req, res, next) {
          var cart = req.session.cart;
          var art_id = req.params._id;
      
          var pos = cart.map(function(x) {return x.id; }).indexOf(art_id);
          var art_to_remove = cart[pos];
          cart.splice(pos, 1);
      
          console.log(art_to_remove);
          console.log(cart);
      
          res.send('deleted')
      }
      

      【讨论】:

        【解决方案5】:

        以下示例有效:

        (function() {
          'use strict';
          var foo = [{x:1}, {y:2}, {z:3}];
          alert(delete foo[0]);
        }());

        虽然下面没有:

        (function() {
          'use strict';
          var foo = [{x:1}, {y:2}, {z:3}];
          var y = foo[0];
          delete y;
        }());

        所以对于strict 模式下的delete,您可能应该使用类似array[index]object[property]object.property 的语法。引用相同的变量不起作用。

        此外,不建议在阵列上使用delete,因为它不会更新阵列的length 并会导致阵列中的空洞。使用splice 总是更好。

        【讨论】:

          【解决方案6】:

          我们不能直接从数组中删除对象。看看这个答案..
          How do I remove an object from an array with JavaScript?

          【讨论】:

            猜你喜欢
            • 2016-11-08
            • 2016-05-12
            • 2018-11-14
            • 1970-01-01
            • 2016-05-19
            • 2021-10-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多