JavaScript - почему мое приложение считает этот массив пустым? - PullRequest
0 голосов
/ 06 декабря 2018

Новичок в 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 голосов
/ 06 декабря 2018

Прочитайте его 3 раза. Я до сих пор не знаю, чего вы пытаетесь достичь, но если проблема заключается в обнаружении пустых массивов (только пустых, а не заполненных неопределенными или нулевыми значениями), то это будет работать:

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

Это проверяет, является ли подозреваемый объект массивом, и затем замыкает, если это не так.Если это так, он проверяет, является ли он пустым.Если оно пустое, все выражение верно.

Это то, что вы хотите обнаружить?

0 голосов
/ 06 декабря 2018

Потому что в 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
    .
    .
    .
});
0 голосов
/ 06 декабря 2018

Похоже, вы ищете ложные значения или пустые массивы.

Object.entries(myObj).forEach(([k, v]) => {
    if (!v || (Array.isArray(v) && v.length === 0)) {
        console.log(`${k} is falsy or an empty array`)
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...