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

时间:2018-12-06 12:42:16

标签: 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:[]”?有什么想法的人吗?

3 个答案:

答案 0 :(得分:2)

因为在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
    .
    .
    .
});

答案 1 :(得分:0)

看起来您正在寻找错误的值或空数组。

Object.entries(myObj).forEach(([k, v]) => {
    if (!v || (Array.isArray(v) && v.length === 0)) {
        console.log(`${k} is falsy or an empty array`)
    }
})

答案 2 :(得分:0)

通读3次,我仍然不知道您要达到什么目的,但是如果问题是检测到空数组(仅空数组而不是未定义或空值填充的数组),那么它将起作用:

Array.isArray(suspectingThisIsArray) && suspectingThisIsArray.length == 0

这将检查可疑对象是否为数组,如果不是,则将其短路。如果是,则检查它是否为空。如果为空,则整个表达式为真。

这是您想要检测的吗?