如何从对象中删除所有 null 和空字符串值?

IT技术 javascript jquery
2021-02-03 03:05:25

你能告诉我如何从对象中删除所有空字符串值吗?删除密钥时出现错误。

到目前为止,这是我所拥有的,但它无法正常工作:

$.each(sjonObj, function(key, value) {
    if(value == "" || value == null) {
        delete sjonObj.key;
    }
});

6个回答

你正在删除sjonObj.key,字面意思。您需要使用数组访问符号:

delete sjonObj[key];

但是,这也会删除 value 等于 0 的地方,因为您没有使用严格比较。使用===来代替:

$.each(sjonObj, function(key, value){
    if (value === "" || value === null){
        delete sjonObj[key];
    }
});

但是,这只会浅浅地行走对象。要深入做到这一点,您可以使用递归:

(function filter(obj) {
    $.each(obj, function(key, value){
        if (value === "" || value === null){
            delete obj[key];
        } else if (Object.prototype.toString.call(value) === '[object Object]') {
            filter(value);
        } else if ($.isArray(value)) {
            $.each(value, function (k,v) { filter(v); });
        }
    });
})(sjonObj);


请注意,如果您愿意使用像 lodash/underscore.js 这样的库,则可以_.pick改用。但是,您仍然需要使用递归进行深度过滤,因为这两个库都没有提供深度过滤功能。

sjonObj = (function filter(obj) {
    var filtered = _.pick(obj, function (v) { return v !== '' && v !== null; });
    return _.cloneDeep(filtered, function (v) { return v !== filtered && _.isPlainObject(v) ? filter(v) : undefined; });
})(sjonObj);

此变体具有不修改原始对象的额外优势,但它确实创建了一个全新的副本,如果您不需要原始对象,则效率会降低。

我不确定是否强制要求返回“[object Object]”。(或者可能是这样,我需要查看规范。)
2021-03-31 03:05:25
@user2864740 如果它是一个没有toString属性的对象文字,是的。
2021-04-03 03:05:25
在 Lodash 4.17.10 中,“pick”需要改为“pickBy”,“cloneDeep”需要改为“cloneDeepWith”
2021-04-03 03:05:25

使用一些ES6 / ES2015

如果您不喜欢创建额外的功能并删除“内联”项目。

Object.keys(obj).forEach(k => (!obj[k] && obj[k] !== undefined) && delete obj[k]);

jsbin

一样,写成函数。

const removeEmpty = (obj) => {
  Object.keys(obj).forEach((k) => (!obj[k] && obj[k] !== undefined) && delete obj[k]);
  return obj;
};

jsbin

此函数也使用递归从嵌套对象中删除项目:

const removeEmpty = (obj) => {
  Object.keys(obj).forEach(k =>
    (obj[k] && typeof obj[k] === 'object') && removeEmpty(obj[k]) ||
    (!obj[k] && obj[k] !== undefined) && delete obj[k]
  );
  return obj;
};

jsbin

与之前的函数相同,但使用ES7 / 2016 Object.entries

const removeEmpty = (obj) => {
  Object.entries(obj).forEach(([key, val])  =>
    (val && typeof val === 'object') && removeEmpty(val) ||
    (val === null || val === "") && delete obj[key]
  );
  return obj;
};

与第三个示例相同,但在普通ES5 中

function removeEmpty(obj) {
  Object.keys(obj).forEach(function(key) {
    (obj[key] && typeof obj[key] === 'object') && removeEmpty(obj[key]) ||
    (obj[key] === '' || obj[key] === null) && delete obj[key]
  });
  return obj;
};

jsbin

为了记录:我觉得问题是重复的,而不是答案。当我们没有将问题标记为重复时,我很欣赏重复的答案。
2021-03-23 03:05:25
对不起,我试图在你的解决方案@Rotareti 中添加检查我的 obj[key] 是否为空的方法,但到目前为止我没有这样做。请问您是否可以将其添加到您的原始提案中?
2021-03-25 03:05:25
它应该只删除=== ""或 的项目=== null确保您使用===而不是==.
2021-03-26 03:05:25
请不要复制多个问题的答案;这与您对类似问题的回答相同
2021-03-28 03:05:25
这种方法的问题function removeEmpty(obj) { Object.keys(obj).forEach(function(key) { (obj[key] && typeof obj[key] === 'object') && removeEmpty(obj[key]) || (obj[key] === '' || obj[key] === null) && delete obj[key] }); return obj; }; 它还删除了 obj[key] 对布尔值的引用(例如 false)
2021-04-12 03:05:25

var data = [
   { "name": "bill", "age": 20 },
   { "name": "jhon", "age": 19 },
   { "name": "steve", "age": 16 },
   { "name": "larry", "age": 22 },
   null, null, null
];

//eliminate all the null values from the data
data = data.filter(function(x) { return x !== null }); 

console.log("data: " + JSON.stringify(data));

这可是在关联对象上?
2021-03-13 03:05:25
@JorhelReyes 能否请您详细说明。
2021-03-14 03:05:25
简单的!直的!完美的!惊人的!+1
2021-03-28 03:05:25

基于 suryaPavan 的回答,这个轻微的修改可以在删除对象或数组内的 invidival 空后清理空对象。这可确保您没有空数组或对象。

function removeNullsInObject(obj) {
            if( typeof obj === 'string' || obj === "" ){
                return;
            }
            $.each(obj, function(key, value){
                if (value === "" || value === null){
                    delete obj[key];
                } else if ($.isArray(value)) {
                    if( value.length === 0 ){
                        delete obj[key];
                        return;
                    }
                    $.each(value, function (k,v) {
                        removeNullsInObject(v);
                    });
                    if( value.length === 0 ){
                        delete obj[key];
                    }
                } else if (typeof value === 'object') {
                    if( Object.keys(value).length === 0 ){
                        delete obj[key];
                        return;
                    }
                    removeNullsInObject(value);
                    if( Object.keys(value).length === 0 ){
                        delete obj[key];
                    }
                }
            });
 }

我将利用 JSON 解析reviver参数从嵌套对象中删除空或空值。

const test = {
   a: 0,
   b: null,
   c: '',
   d: {
    e: 1,
    f: null
   },
   g: {
    h: null
   }
 }

const check = JSON.parse(JSON.stringify(test),
(key, value) => value === null || value === '' ? undefined : value);

console.log(check)