javascript - 无法删除具有空值的 JSON 项目

标签 javascript json parsing

我正在从一个 API 接收数据,其中有 2 title和 2 author属性(例如,将它们称为 title_1title_2)。我只需要一个标题或作者即可保存到我的数据库,因此如果 title_1 两者都存在,则我认为该项目无效。和title_2为空。

所以问题来了,它似乎对作者有用,但尽管title_1,但我最终总是会保存一个项目。是nulltitle_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/

相关文章:

javascript - 使用 Riot.js 进行服务器端渲染 + 路由?

javascript - 在javascript中使用for循环选择dom

java - 对于 Jackson,如何安全地共享 ObjectMapper ?有没有不可变的ObjectMapper?

java - GSON 中有效双数的 NumberFormatException

JAVA解析txt文件中的数据

parsing - Haskell 'else' 解析错误

python - 如何模拟点击元素?

javascript - 如何显示我的 GridX

javascript - Leaflet点击事件无法仅监听 map 图层

javascript - 如何保存深层嵌套对象中的更改?