最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Remove empty brackets from a JSON object - Stack Overflow

programmeradmin0浏览0评论

I would like to remove the matching elements {}, and {} from a JSON string.

Input : "test": [{},{},{},{},{},{},{}],

Output : "test": [],

To do so, I tried :

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

console.log(jsonFinal);

and many more.

How can I remove only those set of elements from my JSON without impacting the other brackets and ma?

I would like to remove the matching elements {}, and {} from a JSON string.

Input : "test": [{},{},{},{},{},{},{}],

Output : "test": [],

To do so, I tried :

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

console.log(jsonFinal);

and many more.

How can I remove only those set of elements from my JSON without impacting the other brackets and ma?

Share Improve this question asked Feb 8, 2016 at 17:26 SuperslinkySuperslinky 531 silver badge12 bronze badges 2
  • you want do this for concrete property test? – Grundy Commented Feb 8, 2016 at 17:28
  • 2 Why are you trying to do this by manipulating the JSON text? Why not manipulate the actual object and then stringify it? jsonObj.test = []; if test was a direct property of jsonObj – Patrick Evans Commented Feb 8, 2016 at 17:29
Add a ment  | 

4 Answers 4

Reset to default 4

Do NOT attempt to modify JSON with string manipulation functions.

ALWAYS parse the JSON, transform the data, and re-stringify to JSON.

EDIT: this answer addresses your ment that the input data object will contain other potential keys that should be present in the output.

// a couple of procedures to help us transform the data
const isEmptyObject = x => Object.keys(x).length === 0;
const not = x => ! x;
const p = f => g => x => f (g (x));
const remove = f => xs => xs.filter (p (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}'

I like the ES2015 answer of @naomik.
This is another alternative:

/**
 * 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;
  }
}());

Now lets test the code:

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({}));

You should work on the actual object not the string.

If you do, you can loop through the object and check if it has any properties. If it doesn't have any, you can remove it.

for(var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
       //remove here
    }
}

Setting aside the question of whether string manipulation is the best way to tidy up JSON data, your earlier attempts would remove all braces and mas, because [] in a regexp indicates "match any of the characters contained inside these brackets". If you were trying to treat those as literal characters, they'd need to be escaped: \[ or \]

You want something like .replace(/{},?/g,"") (which means "match all instances of the string {} or the string {}, -- the question mark makes the preceding character an optional match).

(This would, of course, remove all empty objects from the string, and has the potential to create invalid JSON given input like "foo: {}, bar: {}" -- so only use this if you're certain that your data will never include intentionally empty objects.)

发布评论

评论列表(0)

  1. 暂无评论