Javascript - 为什么我的应用程序认为这个数组是空的?

标签 javascript arrays object if-statement

javascript 初学者,请多多包涵。

我正在尝试创建一个程序来检查对象中是否存在任何空值、空值或未定义值。它在大多数情况下似乎工作正常,但是当对象中有一个数组时,它在填充时显示为“空项”。

有人可以告诉我如何修改我的代码以便检查数组是否真的为空吗?

我的代码如下:

const myObj = 
  {  "tags": ["A", "B", "C"],
    "shared_with": ["abc", "123"],
    "list": [],
    "public_jobs": true,
    "config": null,
    "id": 9406,
    "name": "",
  }

const removeNotEmpty = (obj) => {
  Object.keys(obj).forEach(k => {//for each property of the object
      if(typeof obj[k] === 'object' && obj[k] !== null){//if the property is an object
          removeNotEmpty(obj[k]);//recurse
    }else if(obj[k]){//if property is truthy
      delete obj[k];//remove it from the object
    }else if(obj[k] == !obj.length){
      delete obj[k];
    }
  });
  return obj;
};

// make sure to copy the object if you don't want to modify the first 
// (that's what the Object.assign is for)
console.log(removeNotEmpty(Object.assign({},myObj)));

提前致谢。

编辑:所以我根据下面的建议对我的代码进行了一些编辑,现在这就是我的代码

const myObj = 
  {  "tags": ["A", "B", "C"],
    "shared_with": ["abc", "123"],
    "list": [],
    "public_jobs": true,
    "config": null,
    "id": 9406,
    "name": "",
  }

const removeNotEmpty = (obj) => {
  Object.keys(obj).forEach(k => {//for each property of the object
      if(Object.prototype.toString.call(obj[k]) === '[object Array]'){
        delete obj[k];
    }else if(typeof obj[k] === 'object' && obj[k] !== null){//if the property         
IS an object
          removeNotEmpty(obj[k]);//recurse)
    }else if(obj[k]){//if property is truthy
      delete obj[k];//remove it from the object
    }
  });
  return obj;
};

console.log(removeNotEmpty(Object.assign({},myObj)));//make sure to copy the     
object if you don't want to modify the first (that's what the Object.assign 
is for)

现在的问题是它不显示空数组,比如"list:[]"?大家有什么想法吗?

最佳答案

因为在 JS 中,数组是一个对象。

因此,"tags": ["A", "B", "C"] 将转到第一个 If 子句。因为它是一个对象而且不为空。如果您使用 Object.keys 迭代一个数组,它会将索引作为 Keys 返回。

因此,您需要一个条件来检查键是否为数组。这可以通过

Array.isArray(obj[k])

Object.prototype.toString.call(obj[k]) === '[object Array]';

编辑: 悠闲地将它添加到第一个 if 子句中。

Object.keys(obj).forEach(k => {
    if(Object.prototype.toString.call(obj[k]) === '[object Array]' && obj[k].length >0 ){
    //delete stuff
    }else if(...//remaining code
    .
    .
    .
});

关于Javascript - 为什么我的应用程序认为这个数组是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53651727/

相关文章:

标准库中值和对象的 C++11 示例?

javascript - 为对象属性赋值并除以长度

javascript - 为什么 Sequelize 中会返回 Promise

javascript - 使用 ReactJS 的映射函数内的三元

javascript - 映射两个对象数组以准备 'upload' 的最有效方法

javascript - 如何在 JavaScript 中使用异步函数分配对象值

javascript - CoffeeScript 中的函数声明

javascript - 关于Javascript注入(inject)的问题

c# - 索引超出范围错误,如果不是

c# - 如何从 C# 中的类对象数组访问属性?