如何在JavaScript对象中删除所有值为undefined
或null
的属性?
(该问题类似于此问题针对数组的解决方案)
一个简单的一行代码 (返回一个新对象)。
let o = Object.fromEntries(Object.entries(obj).filter(([_, v]) => v != null));
与上述相同,但写成一个函数。
function removeEmpty(obj) {
return Object.fromEntries(Object.entries(obj).filter(([_, v]) => v != null));
}
这个函数使用递归来删除嵌套对象中的元素。
function removeEmpty(obj) {
return Object.fromEntries(
Object.entries(obj)
.filter(([_, v]) => v != null)
.map(([k, v]) => [k, v === Object(v) ? removeEmpty(v) : v])
);
}
一个简单的一行代码。警告:这会改变给定对象而不是返回新对象。
Object.keys(obj).forEach((k) => obj[k] == null && delete obj[k]);
一个声明(不会改变给定的对象)。
let o = Object.keys(obj)
.filter((k) => obj[k] != null)
.reduce((a, k) => ({ ...a, [k]: obj[k] }), {});
同上,但作为一个函数编写。
function removeEmpty(obj) {
return Object.entries(obj)
.filter(([_, v]) => v != null)
.reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {});
}
这个函数使用递归来从嵌套对象中删除项目。
function removeEmpty(obj) {
return Object.entries(obj)
.filter(([_, v]) => v != null)
.reduce(
(acc, [k, v]) => ({ ...acc, [k]: v === Object(v) ? removeEmpty(v) : v }),
{}
);
}
与上面的函数相同,但以命令式(非函数式)风格编写。
function removeEmpty(obj) {
const newObj = {};
Object.entries(obj).forEach(([k, v]) => {
if (v === Object(v)) {
newObj[k] = removeEmpty(v);
} else if (v != null) {
newObj[k] = obj[k];
}
});
return newObj;
}
在旧的日子里,事情更加冗长。
这是一个使用函数式风格编写的非递归版本。
function removeEmpty(obj) {
return Object.keys(obj)
.filter(function (k) {
return obj[k] != null;
})
.reduce(function (acc, k) {
acc[k] = obj[k];
return acc;
}, {});
}
这是一个非递归版本,采用命令式的风格编写。
function removeEmpty(obj) {
const newObj = {};
Object.keys(obj).forEach(function (k) {
if (obj[k] && typeof obj[k] === "object") {
newObj[k] = removeEmpty(obj[k]);
} else if (obj[k] != null) {
newObj[k] = obj[k];
}
});
return newObj;
}
并且以函数式编程风格编写的递归版本。
function removeEmpty(obj) {
return Object.keys(obj)
.filter(function (k) {
return obj[k] != null;
})
.reduce(function (acc, k) {
acc[k] = typeof obj[k] === "object" ? removeEmpty(obj[k]) : obj[k];
return acc;
}, {});
}
Object.keys(myObj).forEach(function (key) {(myObj[key] == null) && delete myObj[key]});
- NeurotransmitterObject.entries(myObj).reduce((acc, [key, val]) => { if (val) acc[key] = val; return acc; }, {})
- Paul Slm您可以循环遍历对象:
var test = {
test1: null,
test2: 'somestring',
test3: 3,
}
function clean(obj) {
for (var propName in obj) {
if (obj[propName] === null || obj[propName] === undefined) {
delete obj[propName];
}
}
return obj
}
console.log(test);
console.log(clean(test));
如果您担心这个属性删除不会沿着对象的原型链运行,您还可以:
function clean(obj) {
var propNames = Object.getOwnPropertyNames(obj);
for (var i = 0; i < propNames.length; i++) {
var propName = propNames[i];
if (obj[propName] === null || obj[propName] === undefined) {
delete obj[propName];
}
}
}
关于 null 和 undefined 的一些注记:
test.test1 === null; // true
test.test1 == null; // true
test.notaprop === null; // false
test.notaprop == null; // true
test.notaprop === undefined; // true
test.notaprop == undefined; // true
ES6+的最短单行代码
过滤所有假值(""
、0
、false
、null
、undefined
)
Object.entries(obj).reduce((a,[k,v]) => (v ? (a[k]=v, a) : a), {})
过滤null
和undefined
的值:
Object.entries(obj).reduce((a,[k,v]) => (v == null ? a : (a[k]=v, a)), {})
只筛选null
Object.entries(obj).reduce((a,[k,v]) => (v === null ? a : (a[k]=v, a)), {})
仅筛选undefined
Object.entries(obj).reduce((a,[k,v]) => (v === undefined ? a : (a[k]=v, a)), {})
递归解决方案:过滤掉null
和undefined
针对对象:
const cleanEmpty = obj => Object.entries(obj)
.map(([k,v])=>[k,v && typeof v === "object" ? cleanEmpty(v) : v])
.reduce((a,[k,v]) => (v == null ? a : (a[k]=v, a)), {});
对于对象和数组:
const cleanEmpty = obj => {
if (Array.isArray(obj)) {
return obj
.map(v => (v && typeof v === 'object') ? cleanEmpty(v) : v)
.filter(v => !(v == null));
} else {
return Object.entries(obj)
.map(([k, v]) => [k, v && typeof v === 'object' ? cleanEmpty(v) : v])
.reduce((a, [k, v]) => (v == null ? a : (a[k]=v, a)), {});
}
}
v == null
,则会检查是否为 undefined
和 null
。 - Megajinarr = arr.filter(v=>v!==null)
。 - Superolereduce
、三元运算符、逗号操作符、赋值表达式和单字母变量名都在同一语句中。 - ruohola如果你正在使用lodash或underscore.js,这里有一个简单的解决方案:
var obj = {name: 'John', age: null};
var compacted = _.pickBy(obj);
这将仅适用于lodash 4,如果使用lodash 4之前的版本或underscore.js,请使用 _.pick(obj,_.identity)
;
_.omit(obj, _.isUndefined)
。 - JHH_.isUndefined
并不会忽略null
,使用_.omitBy(obj, _.isNil)
可以同时忽略undefined
和null
。 - Lukasz Wiktor如果有人需要Owen和Eric答案的递归版本,这里是:
/**
* Delete all null (or undefined) properties from an object.
* Set 'recurse' to true if you also want to delete properties in nested objects.
*/
function delete_null_properties(test, recurse) {
for (var i in test) {
if (test[i] === null) {
delete test[i];
} else if (recurse && typeof test[i] === 'object') {
delete_null_properties(test[i], recurse);
}
}
}
JSON.stringify会删除未定义的键。
removeUndefined = function(json){
return JSON.parse(JSON.stringify(json))
}
null
视为 undefined
,请使用替换函数,有关更多信息,请参见此答案:https://dev59.com/JnVC5IYBdhLWcg3wdw65#24190282 - Hooman Askarinull
值。尝试以下代码: let a = { b: 1, c: 0, d: false, e: null, f: undefined, g: [], h: {} }
,并执行 console.log(removeUndefined(a))
。本问题是关于 undefined
和 null
值的。 - mayidJSON.stringify
、其 replacer 参数和 JSON.parse
将其转换回对象。使用此方法还意味着替换将适用于嵌套对象中的所有嵌套键。
示例对象var exampleObject = {
string: 'value',
emptyString: '',
integer: 0,
nullValue: null,
array: [1, 2, 3],
object: {
string: 'value',
emptyString: '',
integer: 0,
nullValue: null,
array: [1, 2, 3]
},
arrayOfObjects: [
{
string: 'value',
emptyString: '',
integer: 0,
nullValue: null,
array: [1, 2, 3]
},
{
string: 'value',
emptyString: '',
integer: 0,
nullValue: null,
array: [1, 2, 3]
}
]
};
替换函数
function replaceUndefinedOrNull(key, value) {
if (value === null || value === undefined) {
return undefined;
}
return value;
}
清洁物品
exampleObject = JSON.stringify(exampleObject, replaceUndefinedOrNull);
exampleObject = JSON.parse(exampleObject);
const clean = (object: object) => JSON.parse(JSON.stringify(object, (_, value) => value ?? undefined));
- Alexis Tyler这是一个最简单的 Lodash 解决方案,用于返回一个过滤掉 null
和 undefined
值的对象。
_.omitBy(obj, _.isNil)
使用json.stringify的replacer参数可以在一行中进行递归删除。
const removeEmptyValues = obj => (
JSON.parse(JSON.stringify(obj, (k,v) => v ?? undefined))
)
使用方法:
removeEmptyValues({a:{x:1,y:null,z:undefined}}) // Returns {a:{x:1}}
正如 Emmanuel 在评论中提到的那样,如果您的数据结构仅包含可以放入 JSON 格式的数据类型(如字符串、数字、列表等),则此技术才有效。
(已更新答案以使用新的 空值合并运算符。根据浏览器支持的需求,您可能要使用此函数代替:(k,v) => v!=null ? v : undefined
)
NaN
转换为null
,但不会将其删除。 - Emmanuel N K您可能正在寻找delete
关键字。
var obj = { };
obj.theProperty = 1;
delete obj.theProperty;
JSON.parse(JSON.stringify(obj))
的意思是将一个对象进行深拷贝。 - STEEL