我有一个JSON obj,经过一些操作(比如删除一些部分),我打印出来,除了我有一些null
值之外,一切看起来都不错。如何删除这些?
我使用JSON.stringify(obj, null, 2)
方法进行打印,这就是它的样子:
{
"store": {
"book": [
null,
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
null,
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
null,
"price": 19.95
}
}
}
我希望它非常紧凑且非常干净(删除额外的3 null
个值):
{
"store": {
"book": [
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
答案 0 :(得分:36)
我必须解决类似的问题,但我不仅要删除 null 值,还要删除未定义, NaN ,空字符串,空数组和空对象值,通过检查嵌套对象和嵌套数组递归。
以下功能正在使用Lo-Dash:
function pruneEmpty(obj) {
return function prune(current) {
_.forOwn(current, function (value, key) {
if (_.isUndefined(value) || _.isNull(value) || _.isNaN(value) ||
(_.isString(value) && _.isEmpty(value)) ||
(_.isObject(value) && _.isEmpty(prune(value)))) {
delete current[key];
}
});
// remove any leftover undefined values from the delete
// operation on an array
if (_.isArray(current)) _.pull(current, undefined);
return current;
}(_.cloneDeep(obj)); // Do not modify the original object, create a clone instead
}
例如,如果使用以下输入对象调用方法:
var dirty = {
key1: 'AAA',
key2: {
key21: 'BBB'
},
key3: {
key31: true,
key32: false
},
key4: {
key41: undefined,
key42: null,
key43: [],
key44: {},
key45: {
key451: NaN,
key452: {
key4521: {}
},
key453: [ {foo: {}, bar:''}, NaN, null, undefined ]
},
key46: ''
},
key5: {
key51: 1,
key52: ' ',
key53: [1, '2', {}, []],
key54: [{ foo: { bar: true, baz: null }}, { foo: { bar: '', baz: 0 }}]
},
key6: function () {}
};
它将以递归方式丢弃所有“坏”值,最后只保留带有某些信息的值。
var clean = pruneEmpty(dirty);
console.log(JSON.stringify(clean, null, 2));
{
key1: 'AAA',
key2: {
key21: 'BBB'
},
key3: {
key31: true,
key32: false
},
key5: {
key51: 1,
key52: ' ',
key53: [1, '2'],
key54: [{ foo: { bar: true }}, { foo: { baz: 0 }}]
}
};
希望它有所帮助!
答案 1 :(得分:13)
// Iterate the array from back to front, removing null entries
for (var i=obj.store.book.length;i--;){
if (obj.store.book[i]===null) obj.store.book.splice(i,1);
}
如果要从对象和数组中递归删除所有null
值:
// Compact arrays with null entries; delete keys from objects with null value
function removeNulls(obj){
var isArray = obj instanceof Array;
for (var k in obj){
if (obj[k]===null) isArray ? obj.splice(k,1) : delete obj[k];
else if (typeof obj[k]=="object") removeNulls(obj[k]);
}
}
见过:
var o = {
"store": {
"book": [
null,
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
null,
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"bad": null,
"price": 19.95
}
}
}
removeNulls(o);
console.log(JSON.stringify(o,null,2));
// {
// "store": {
// "book": [
// {
// "category": "fiction",
// "author": "Evelyn Waugh",
// "title": "Sword of Honour",
// "price": 12.99
// },
// {
// "category": "fiction",
// "author": "J. R. R. Tolkien",
// "title": "The Lord of the Rings",
// "isbn": "0-395-19395-8",
// "price": 22.99
// }
// ],
// "bicycle": {
// "color": "red",
// "price": 19.95
// }
// }
// }
答案 2 :(得分:4)
修复book
数组非常简单 - 只需过滤掉空值即可。最直接的方法可能是构建一个新阵列并重新分配它:
var temp = [];
var i;
for (i = 0; i < obj.store.book.length; ++i) {
if (obj.store.book[i] != null) {
temp.push(obj.store.book[i]);
}
}
obj.store.book = temp;
我确信还有很多其他方法,比如使用jQuery或filter
函数(我认为在旧浏览器中不可用)。您还可以循环遍历数组并splice
输出空值。我发现这种方式最容易阅读。
答案 3 :(得分:2)
以下是@Phrogz对答案的修改。如果book [3]也为null,则给出的答案不会删除最后一个null,因为在最后一个循环的迭代中数组的长度将小于k。
以下方法可以通过对数组执行第二次调用来实现:
function removeNulls(obj) {
var isArray = obj instanceof Array;
for (var k in obj) {
if (obj[k] === null) isArray ? obj.splice(k, 1) : delete obj[k];
else if (typeof obj[k] == "object") removeNulls(obj[k]);
if (isArray && obj.length == k) removeNulls(obj);
}
return obj;
}
答案 4 :(得分:1)
你如何删除你的作品?
删除数组元素,delete
运算符在数组中留下一个洞。
相反,您应该使用Array.splice来正确删除数组中的元素。
答案 5 :(得分:1)
请使用此npm包
npm i --save nnjson
var nnjson = require('nnjson');
user = {
a: null,
b: 'hello',
c: {
c1: 'world',
c2: null
}
}
var newUser = nnjson.removeNull(user);
console.log (newUser)
结果
{
b: 'hello',
c: {
c1: 'world'
}
}
答案 6 :(得分:0)
我在这里使用代码
Remove empty elements from an array in Javascript
然后你可以称之为
JSON.stringify(obj.clean(null),null,2)
您需要修改代码以使用对象(或使用对象内部的代码)
答案 7 :(得分:0)
我们可以一起使用JSON.stringify和JSON.parse从对象中递归删除空白属性。
jsObject = JSON.parse(JSON.stringify(jsObject), (key, value) => {
if (value == null || value == '' || value == [] || value == {})
return undefined;
return value;
});