Как проверить наличие пустого объекта JavaScript?

Другое решение rm(list=ls(pattern="temp")), удалите все объекты, соответствующие шаблону.

2517
задан JJJ 4 June 2019 в 21:49
поделиться

9 ответов

Нет никакого простого способа сделать это. Необходимо будет циклично выполниться по свойствам явно:

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return true;
}

Если поддержка ECMAScript 5 доступна, можно использовать Object.keys() вместо этого:

function isEmpty(obj) {
    return Object.keys(obj).length === 0;
}
823
ответ дан 22 November 2019 в 19:51
поделиться
  1. Просто обходное решение. Ваш сервер может генерировать некоторое специальное свойство в случае никаких данных?

    Например:

    var a = {empty:true};
    

    Затем можно легко проверить его в код обратного вызова Ajax.

  2. Другой способ проверить его:

    if (a.toSource() === "({})")  // then 'a' is empty
    

Править: Если Вы пользуетесь какой-либо библиотекой JSON (f.e. JSON.js) затем можно попробовать JSON.encode (), функционируют и тестируют результат против пустой строки значения.

24
ответ дан 22 November 2019 в 19:51
поделиться
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
12
ответ дан 22 November 2019 в 19:51
поделиться

В дополнение к ответу Thevs:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

это jquery + jquery.json

5
ответ дан 22 November 2019 в 19:51
поделиться

Для тех из вас, у кого такая же проблема, но использует jQuery, вы можете использовать jQuery.isEmptyObject .

558
ответ дан 22 November 2019 в 19:51
поделиться
    let jsObject = JSON.parse(JSON.stringify(obj), (key, value) => {
                if (value === null ||
                    value === '' ||
                    (value.constructor === Object && Object.entries(value).length === 0) ||
                    (value.constructor === Array && value.length === 0)) {
                    return undefined
                }
                return value
            })

Это отфильтрует все недопустимые поля рекурсивно.

0
ответ дан 22 November 2019 в 19:51
поделиться

Это - похожий способ того, как в нем регистрируются источник lodash для объекта:

const isEmpty = value => {
  for (const key in value) {
    if (hasOwnProperty.call(value, key)) {
      return false
    }
  }
  return true;
}

, Но существует много других способов сделать это.

0
ответ дан 22 November 2019 в 19:51
поделиться

Идеальное и отказоустойчивое решение

я думаю первые принятые работы решения в большинстве случаев, но не Отказоустойчивы .

лучше и отказоустойчивое решение будет.

function isEmptyObject() { 
  return toString.call(obj) === "[object Object]" 
  && Object.keys(obj).length === 0;
}

или в ES6/7

const isEmptyObject = () => toString.call(obj) === "[object Object]" 
  && Object.keys(obj).length === 0;

С этим подходом, если obj установлен на неопределенный или пустое, код не повреждается. и возвратите пустой указатель.

0
ответ дан 22 November 2019 в 19:51
поделиться

isEmpty для значения любой тип

/* eslint-disable no-nested-ternary */

const isEmpty = value => {
  switch (typeof value) {
    case 'undefined':
      return true;
    case 'object':
      return value === null
        ? true
        : Array.isArray(value)
        ? !value.length
        : Object.entries(value).length === 0 && value.constructor === Object;
    case 'string':
      return !value.length;
    default:
      return false;
  }
};
0
ответ дан 22 November 2019 в 19:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: