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

41

我需要将某个对象的所有属性设置为null。 但是这个对象可能非常大,所以我不能一个一个地处理。

如何一次性地设置所有属性?


想知道是否有ES6的方法来做这件事。 - Dexygen
11个回答

47

这里有一个有用的函数叫做 '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的参考文献。同时,请使用正确的术语,"Attributes"是不正确的。最后,如果你要全面运用函数式编程,应该将函数定义为setAll = val => obj =>...,然后使用const setNull = setAll(null);吗? - user663031
这个答案仍然不能一次性设置所有值。它循环遍历属性。 - user663031
@torazaburo 我不是说它是功能性的...只是用箭头函数而已(顺便说一句,几乎不可能一次性设置所有箭头函数)。 - Nianyi Wang

21
如果你正在寻找一个简短的一行代码进行复制粘贴,请使用以下代码。
Object.keys(obj).forEach((i) => obj[i] = null);

8

使用Array.reduce的另一种方法。它不会覆盖现有对象。这仅适用于对象只有简单值的情况。

const newObj = Object.keys(originalObj).reduce(
  (accumulator, current) => {
    accumulator[current] = null; 
    return accumulator
  }, {});

6
您可以像Nianyi Wang在他的回答中提到的那样使用Object.keys(),或者使用for in,如下所示:
for (key in obj) {
    if (obj.hasOwnProperty(key)) {
        obj[key] = null;
    }
}

但在这种情况下,您需要检查hasOwnProperty()


我也这么想。但是 OP 不想循环,因为对象可能非常大。我认为 @user663031 的想法是可行的。只需创建一个新对象即可。 - Mike S.
当直接在对象上调用hasOwnProperty时,ESLint会抛出一个no-prototype-builtins错误。可以使用Object.prototype.hasOwnProperty.call(obj, key)来代替以消除这个错误。 - Sam Finnigan

4
但对象可能非常大,所以我不能一个接一个地做。 你所说的“大”,是指“数百万个属性”,你担心性能吗?还是指“一堆属性,你不知道名称,也不想列出来”? 如何一次性设置所有属性? 你不能。必须用循环的方式。 不要改变现有对象,考虑创建一个新的空对象。其属性值将为undefined,但根据您的代码结构,这可能有效。

3
如果对象包含子对象,并且您想将所有子对象属性设置为 null,则可以使用递归解决方案。

function setEmpty(input){

    let keys = Object.keys(input);

        for( let key of keys ){

             if(typeof input[key] != "object" ){
                 input[key] = null;
             }else{
                 setEmpty(input[key]);
             }
        }
        return input;
    }


3

使用 cloneDeepWith,Lodash 可以管理此问题。

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

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 } } }

在自定义器中返回undefined 对我来说并不明显,但是这篇答案解释说这样做会触发递归。


1

0

export const setObjToNull = (obj) => {
    var returnObj = {};
    Object.keys(obj).map((key) => {
        let nullObj = { [key]: '' };
        Object.assign(returnObj, nullObj);
    })
    return returnObj;
}


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

你可以使用for in。以下是一个例子:

let obj = {prob1:"value1", prob2:"value2"}
for(let prob in obj){obj[prob]=null} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接