我在本地存储中有一组对象,如下所示:
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));
}
但是当我调用该函数并将其传递给要删除的参数时,它不会删除我想要的那个,而是删除本地存储中的第一个。 有人可以帮帮我吗?
答案 0 :(得分:1)
使用===
无法测试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)
。
答案 1 :(得分:0)
这是因为您的情况永远不会得到满足,因此您的索引变量始终是未定义 ...因此要么在对象中传递一些唯一键值,例如“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 :(得分:0)
您可以使用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));
}
根据数组中传递的对象cat删除项目。 Sample