如何在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方法可以做到这一点