我需要将某个对象的所有属性设置为null
。
但是对象可能非常大,所以我不能一个接一个地做。
如何一次设置所有属性?
答案 0 :(得分:9)
这是一个名为'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);
}
答案 1 :(得分:5)
如果您正在寻找要复制和粘贴的短单行,请使用此
Object.keys(obj).forEach((i) => obj[i] = null);
答案 2 :(得分:4)
但是对象可能非常大,所以我不能一个接一个地做。
“大”你的意思是“数以百万计的财产”你是否关注表现?或者你的意思是“一堆你不知道名字的属性,和/或不想列出名单”?
如何一次设置所有属性?
你做不到。无论如何,你必须循环。
不要改变现有对象,而应考虑创建一个新的空对象。它的属性值为undefined
,但这取决于您的代码结构。
答案 3 :(得分:3)
如果object包含子对象,则要将所有子对象属性设置为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;
}
答案 4 :(得分:2)
您可以使用{Nineri Wang在他的回答中提到的Object.keys()
或for in
,如下所示:
for (key in obj) {
if (obj.hasOwnProperty(key)) {
obj[key] = null;
}
}
但在这种情况下,您应该检查hasOwnProperty()
。
答案 5 :(得分:2)
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 } } }
在定制器中返回undefined
对我来说并不明显,但是this answer解释说,这样做会触发递归。
答案 6 :(得分:0)
使用Array.reduce
的另一种方法。它不会覆盖现有对象。这仅在对象仅具有简单值的情况下有效。
const newObj = Object.keys(originalObj).reduce(
(accumulator, current) => {
accumulator[current] = null;
return accumulator
}, {});
答案 7 :(得分:-1)
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);