如何在JavaScript中将对象的所有值设置为null?

如何在JavaScript中将对象的所有值设置为null?,javascript,Javascript,我需要将某个对象的所有属性设置为null。 但是物体可能很大,所以我不能一个接一个地做 如何一次设置所有属性?这里有一个名为“Object.keys()”的有用函数,它返回对象的所有属性名 let setAll = (obj, val) => Object.keys(obj).forEach(k => obj[k] = val); let setNull = obj => setAll(obj, null); 非箭头功能版本: function setAll(obj, val

我需要将某个对象的所有属性设置为
null
。 但是物体可能很大,所以我不能一个接一个地做


如何一次设置所有属性?

这里有一个名为“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);
}

您可以使用
Object.keys()
,正如王念义在回答中提到的,或者在
中使用
,如下所示:

for (key in obj) {
    if (obj.hasOwnProperty(key)) {
        obj[key] = null;
    }
}
但是在这种情况下,您应该检查
hasOwnProperty()

但是物体可能很大,所以我不能一个接一个地做

你所说的“大”是指“数以百万计的房产”,你关心的是性能吗?或者你的意思是“一堆你不知道名字和/或不想列出的财产”

如何一次设置所有属性

你不能。无论如何,你必须循环


<>而不是对现有对象进行突变,考虑创建一个新的空对象。它的属性值将是
未定义的
,但这可能取决于您的代码结构。

另一种方法是使用
数组。reduce
。它不会覆盖现有对象。仅当对象只有简单值时,此选项才有效

const newObj = Object.keys(originalObj).reduce(
  (accumulator, current) => {
    accumulator[current] = null; 
    return accumulator
  }, {});
let值={
答:1,,
b:“,
c:{
a:“”,
s:4,
d:{
问:“,
w:8,
e:9
}
}
}
价值观
常量completeWithNull=(当前)=>{
Object.keys(当前).forEach((键)=>{
当前[键]=当前[键]=''空
:当前[key]的类型==='object'?completeWithNull(当前[key])
:当前[键]
});
回流;
};

completeWithNull(值)若对象包含子对象,若要将所有子对象属性设置为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;
}

Lodash可以使用
cloneDeepWith
管理此功能

我对同一问题的解决方案:

import * as _ from 'lodash';
const bigObj = {"big": true, "deep": {"nested": {"levels": "many" } } };
const blankObj = _.cloneDeepWith(bigObj, (value) => {return _.isObject(value) ? undefined : null});
console.log(blankObj);
// outputs { big: null, deep: { nested: { levels: null } } }

在customizer中返回
未定义的
,这对我来说并不明显,但解释了这样做会触发递归。

如果您正在寻找一个短的单行程序来复制和粘贴,请使用此命令

Object.keys(obj).forEach((i) => obj[i] = null);

请提供
对象.键的参考
。此外,请使用正确的术语。“属性”不正确。最后,如果要获得所有函数,是否应该将函数定义为
setAll=val=>obj=>…
,然后再定义
const setNull=setAll(null)?此答案仍然不会“一次”设置所有值。它在属性上循环。@torazaburo我不是说它有功能。。。仅仅使用箭头函数lol(顺便说一句,几乎不可能同时设置所有的箭头函数),我也这么认为。但OP不想循环b/c对象可能很大。我认为@user663031的想法是合理的。只需创建一个新对象。当直接在对象上调用
hasOwnProperty
时,ESLint抛出一个错误
no prototype builtins
。可以使用
Object.prototype.hasOwnProperty.call(obj,key)
使其静音。想知道是否有ES6方法可以做到这一点