Мне нужно установить все свойства некоторого объекта на null. Но объект может быть очень большим, поэтому я не могу просто сделать это один за другим.

Как установить все свойства сразу?

16
Pilgrim 26 Авг 2017 в 20:16

6 ответов

Лучший ответ

Вот полезная функция с именем Object.keys (), она возвращает все имена атрибутов объекта.

let setAll = (obj, val) => Object.keys(obj).forEach(k => obj[k] = val);
let setNull = obj => setAll(obj, null);

Версия без функции стрелки:

function setAll(obj, val) {
    /* Duplicated with @Maksim Kalmykov
        for(index in obj) if(obj.hasOwnProperty(index))
            obj[index] = val;
    */
    Object.keys(obj).forEach(function(index) {
        obj[index] = val
    });
}
function setNull(obj) {
    setAll(obj, null);
}
19
Caio Ladislau 26 Дек 2018 в 12:49

Но объект может быть очень большим, поэтому я не могу просто сделать это один за другим.

Под «большими» вы подразумеваете «миллионы объектов» и беспокоитесь о производительности? Или вы имеете в виду «набор свойств, названия которых вы не знаете и / или не хотите иметь в списке»?

Как установить все свойства сразу?

Ты не можешь Так или иначе, вы должны зацикливаться.

Вместо того, чтобы изменять существующий объект, подумайте о создании нового, пустого объекта. Значения его свойств будут undefined, но это может работать в зависимости от структуры вашего кода.

4
26 Авг 2017 в 18:17

Если объект содержит дочерний объект, если вы хотите установить все свойства дочернего объекта в null, рекурсивное решение приведено ниже.

function setEmpty(input){

let keys = Object.keys(input);

    for( key of keys ){

         if(typeof input[key] != "object" ){
             input[key] = null;
         }else{
             setEmpty(input[key]);
         }
    }
    return input;
}
1
Malaji Nagaraju 25 Фев 2020 в 11:23
let values = {
    a:1, 
    b:'', 
    c: {
        a:'', 
        s:4, 
        d: {
            q: '',
            w: 8,
            e: 9
        }
 
    }
}


values;

const completeWithNull = (current) => {
  Object.keys(current).forEach((key) => {
   		current[key] = current[key] === ''? null 
    	: typeof current[key] === 'object' ? completeWithNull(current[key])
    	: current[key]
  });
  
  return current;
};

completeWithNull(values);
-1
Bruno Souza 14 Фев 2019 в 15:09

Еще один способ сделать это, используя Array.reduce. Он не перезаписывает существующий объект. Это работает, только если объект имеет только простые значения.

const newObj = Object.keys(originalObj).reduce(
  (accumulator, current) => {
    accumulator[current] = null; 
    return accumulator
  }, {});
5
Xun Yang 3 Дек 2018 в 09:31

Вы можете использовать Object.keys(), как упомянул Няньи Ван в своем ответе, или for in, например так:

for (key in obj) {
    if (obj.hasOwnProperty(key)) {
        obj[key] = null;
    }
}

Но в этом случае вы должны проверить hasOwnProperty().

5
Maksim Kalmykov 26 Авг 2017 в 17:25