Javascript 从JSON对象中删除空括号

Javascript 从JSON对象中删除空括号,javascript,jquery,json,regex,replace,Javascript,Jquery,Json,Regex,Replace,我想从JSON字符串中删除匹配的元素{}、和{} 输入:“测试”:[{}、{}、{}、{}、{}、{}、{}、{}、{}、{}], 输出:“测试”:[], 为此,我尝试: var jsonConfig = JSON.stringify(jsonObj); var jsonFinal = jsonConfig.replace(/[{},]/g, ''); // Remove global var jsonFinal = jsonConfig.replace(/[{},]/, ''); // Rem

我想从JSON字符串中删除匹配的元素
{}、
{}

输入:
“测试”:[{}、{}、{}、{}、{}、{}、{}、{}、{}、{}],

输出:
“测试”:[],

为此,我尝试:

var jsonConfig = JSON.stringify(jsonObj);
var jsonFinal = jsonConfig.replace(/[{},]/g, ''); // Remove global
var jsonFinal = jsonConfig.replace(/[{},]/, ''); // Remove brackets

console.log(jsonFinal);
还有更多


如何在不影响其他括号和逗号的情况下仅从JSON中删除这些元素集?

抛开字符串操作是否是整理JSON数据的最佳方式的问题不谈,您以前的尝试将删除所有大括号和逗号,因为regexp中的
[]
表示“匹配这些括号中包含的任何字符”。如果您试图将这些字符视为文字字符,则需要对它们进行转义:
\[
\]

您需要类似于
.replace(/{}、/g,“”)
(这意味着“匹配字符串
{}
或字符串
{}的所有实例,
——问号使前面的字符成为可选匹配)


(当然,这将从字符串中删除所有空对象,并有可能在给定输入时创建无效的JSON,如“foo:{},bar:{}”--因此,只有在确定数据永远不会包含故意空的对象时才使用此选项。)

您应该处理实际对象,而不是字符串

如果这样做,可以循环对象并检查其是否具有任何属性。如果没有,可以将其删除

for(var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
       //remove here
    }
}
不要尝试使用字符串操作函数修改JSON

始终解析JSON,转换数据,并将字符串化为JSON

编辑:此答案解决了您的评论,即
输入
数据对象将包含输出中应该存在的其他潜在键

// a couple of procedures to help us transform the data
const isEmptyObject = x => Object.keys(x).length === 0;
const not = x => ! x;
const comp = f => g => x => f (g (x));
const remove = f => xs => xs.filter (comp (not) (f));

// your input json
let json = '{"test": [{},{},{"x": 1}], "test2": [{},{}], "a": 1, "b": 2}';

// parsed json
let data = JSON.parse(json);

// transform data
let output = JSON.stringify(Object.assign({}, data, {

  // remove all empty objects from `test`
  test: remove (isEmptyObject) (data.test),

  // remove all empty objects from `test2`
  test2: remove (isEmptyObject) (data.test2),
}));

// display output
console.log(output); // '{"test":[{"x":1}],"test2":[],"a":1,"b":2}'

我喜欢@naomik的ES2015答案。
这是另一种选择:

/**
 * Remove empty objects or arrays
 * @param  {Object, Array} obj: the object to which remove empty objects or arrays
 * @return {Any}
 */
const removeEmptyObject = (function() {
  const isNotObject = v => v === null || typeof v !== "object";
  const isEmpty = o => Object.keys(o).length === 0;

  return function(obj) {
    if (isNotObject(obj)) return obj;
    if (obj instanceof Array) {
      for (let i = 0; i < obj.length; i += 1) {
        if (isNotObject(obj[i])) continue;
        if (isEmpty(obj[i])) obj.splice(i--, 1);
        else obj[i] = removeEmptyObject(obj[i]);
      }
    }
    else {
      for (let p in obj) {
        if (isNotObject(obj[p])) continue;
        if (!isEmpty(obj[p])) obj[p] = removeEmptyObject(obj[p]);
        if (isEmpty(obj[p])) delete obj[p];
      }
    }
    return obj;
  }
}());

您想对具体属性
测试
执行此操作吗?为什么要通过操纵JSON文本来执行此操作?为什么不操纵实际对象,然后将其字符串化<代码>jsonObj.test=[]
如果
test
jsonObj
的一个直接属性,那么JSON仍然存在
[{“test”:{}}]
形式的问题。我不确定这个案子是否适用于OP,真的!我已经用这个警告更新了答案,谢谢。谢谢你的建议和+1你的答案。请问如何删除
{test:[]}
周围的括号,使其成为
的“test”:[]
而不使用
输出。替换(/[{}]/g,”)为什么要这样做?因为对象嵌套在一个更复杂的结构中,
{“test”:[{},{},{},{}],“test2”:[{},{}],“test3”:[{},{},{}]}
@superslinky,我编辑了我的答案来解决这个问题。其他输入键现在将出现在输出中。@superslinky我提供了一个最终更新,它显示了a)如何从多个键中过滤空对象,以及b)过滤器将保留非空对象。谢谢。它对我有用。只是需要修改一下。例如,您的解决方案不适用于以下情况:
{a:[{a:{}}]}
。所以,我对循环做了如下更改:
for(让I=0;I
var json = '{"test": [{},{},{"x": 1}], "test2": [{},{}], "test3":[[],[1,2,3],[]], "a": 1, "b": 2}';
var data = JSON.parse(json); //Object
var output = removeEmptyObject(data);

console.log(output);
console.log(removeEmptyObject(9));
console.log(removeEmptyObject(null));
console.log(removeEmptyObject({}));