我正在从一个 API 接收数据,其中有 2 title
和 2 author
属性(例如,将它们称为 title_1
和 title_2
)。我只需要一个标题或作者即可保存到我的数据库,因此如果 title_1
两者都存在,则我认为该项目无效。和title_2
为空。
所以问题来了,它似乎对作者有用,但尽管title_1
,但我最终总是会保存一个项目。是null
和title_2
是""
。我不确定为什么,但我认为我解析这些值的方式可能存在问题?
这是我提到的项目的 JSON:
"title_1": null,
"title_2": "",
正如我所说,它成功地将具有相同问题的作者拼接在一起。首先,我获取数据(作为字符串接收)并像这样解析它:
request.get(apiUrl, function(error, response, body) {
if(!error && response.statusCode == 200) {
var data = JSON.parse(body);
callback(error, data.items);
}
});
然后我打电话removeInvalidItems(data);
稍后执行此操作:
function removeInvalidItems(data) {
for (var i = 0; i < data.length; i++) {
if ( !isValid(data[i].title) && !isValid(data[i].title_2) ) {
data.splice(i, 1);
}
if ( !isValid(data[i].author) && !isValid(data[i].author_2) ) {
data.splice(i, 1);
}
}
return data;
};
它正在检查有效性,如下所示:
function isValid(attr) {
if (attr === null || attr === '') {
return false;
} else return true;
};
谁能想到为什么这个项目仍然继续通过这个isValid()
的原因吗?功能是否有效?
最佳答案
您的问题是,当您像 (splice(i, 1)
) 那样拼接数组时,您的“当前索引”已经指向下一个元素。考虑下一个例子。它“应该”从数组中删除奇怪的项目,但它造成了困惑:
var arr = [1, 2, 3, 4, 5, 6];
for(var i = 0; i < arr.length; i++) {
if(i % 2 == 1)
arr.splice(i, 1);
}
alert(arr);
要解决此问题,请在拼接时将 i
减少 1:
function removeInvalidItems(data) {
for (var i = 0; i < data.length; i++) {
if ( !isValid(data[i].title) && !isValid(data[i].title_2) ) {
data.splice(i--, 1);
}
if ( !isValid(data[i].author) && !isValid(data[i].author_2) ) {
data.splice(i--, 1);
}
}
return data;
};
顺便说一句,您可以大大简化您的 isValid
函数:
function isValid(attr) {
return attr instanceof String && attr.length > 0;
};
关于javascript - 无法删除具有空值的 JSON 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32220744/