【问题标题】:delete an object from an array of objects in local storage javascript从本地存储javascript中的对象数组中删除一个对象
【发布时间】:2016-11-02 10:41:53
【问题描述】:

我在本地存储中有一个对象数组,如下所示:

ios = [{
    "id" : 1,
    "type" : "in",
    "cat" : "Diversi",
    "qty" : 50,
    "date" : "2016-11-02T09:51:48.872Z",
    "descr" : ""
  }, {
    "id" : 1,
    "type" : "in",
    "cat" : "Lavoro",
    "qty" : 50,
    "date" : "2016-11-02T10:08:11.362Z",
    "descr" : ""
  }];

我想用这个函数删除其中一个对象:

function remove(io) {
    var ios = localStorage.getItem('ios') ? JSON.parse(localStorage.getItem('ios')) : [];
    var index;
    for (var i = 0; i < ios.length; i++) {
        if (ios[i] === io) {
          index=i;
          break;
        }
    }
    ios.splice(index, 1);
    localStorage.setItem('ios', JSON.stringify(ios));
}

但是当我调用该函数并将参数传递给删除时,它不会删除我想要的那个,而是删除本地存储中的第一个。 谁能帮帮我?

【问题讨论】:

  • 尝试用if (JSON.stringify(ios[i]) === JSON.stringify(io)) {替换if (ios[i] === io) {
  • 传递给remove的是什么?它是一个对象吗?
  • @OliverRadini 是的,我传递了一个对象
  • 不要拼接,过滤。

标签: javascript arrays local-storage


【解决方案1】:

这是因为你的条件永远不会得到满足,所以你的 index 变量总是 undefined ...所以要么在对象中传递一些唯一的键值,比如“id”并比较该键值对,例如:-

function remove(id) {
    var ios = localStorage.getItem('ios') ? JSON.parse(localStorage.getItem('ios')) : [];
    var index;
    for (var i = 0; i < ios.length; i++) {
        if (ios[i].id === id) {
          index=i;
          break;
        }
    }
    if(index === undefined) return 
    ios.splice(index, 1);
    localStorage.setItem('ios', JSON.stringify(ios));
}

使用诸如 LODASH Doc 之类的第三方作为:-

function remove(io) {
        var ios = localStorage.getItem('ios') ? JSON.parse(localStorage.getItem('ios')) : [];
        var index;
        index = _.findIndex(ios , io);
        if(index === -1) return 
        ios.splice(index, 1);
        localStorage.setItem('ios', JSON.stringify(ios));
    }

【讨论】:

    【解决方案2】:

    您无法使用=== 测试两个对象是否相等。尝试使用此功能:

    function isEquivalent(a, b) {
        var aProps = Object.getOwnPropertyNames(a);
        var bProps = Object.getOwnPropertyNames(b);
    
        if (aProps.length != bProps.length) {
            return false;
        }
    
        for (var i = 0; i < aProps.length; i++) {
            var propName = aProps[i];
    
            if (a[propName] !== b[propName]) {
                return false;
            }
        }
    
        return true;
    }
    

    而不是ios[i] === io,你打电话给isEquivalent(ios[i],io)

    【讨论】:

      【解决方案3】:

      你可以使用map函数作为,

      function removeItem() {    
        var ios = JSON.parse(localStorage.getItem('ios'));
        var index = ios.map(function(element) {
          return element.cat;
        }).indexOf(io.cat);
        ios.splice(index, 1);
        localStorage.setItem('ios', JSON.stringify(ios));
      }
      

      根据数组中传递的对象的猫删除项目。 Sample

      【讨论】:

        猜你喜欢
        • 2013-04-16
        • 2016-11-08
        • 2019-05-16
        • 1970-01-01
        • 2020-12-31
        • 1970-01-01
        • 2018-11-07
        • 2018-11-14
        • 1970-01-01
        相关资源
        最近更新 更多