我想从JSON字符串中删除匹配的元素sapjcorfc.dll
和\jre\bin
。
输入: {},
输出: {}
为此,我尝试了:
"test": [{},{},{},{},{},{},{}],
还有更多。
如何在不影响其他括号和逗号的情况下,只从JSON中删除那些元素集?
答案 0 :(得分:4)
NOT 尝试使用字符串操作函数修改JSON。
始终解析JSON,转换数据,然后重新
stringify
为JSON。
编辑:此答案解决了您的评论input
数据对象将包含输出中应存在的其他潜在密钥。
// 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}'
答案 1 :(得分: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;
}
}());
现在让我们测试代码:
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({}));
答案 2 :(得分:1)
你应该处理实际的对象而不是字符串。
如果这样做,您可以遍历该对象并检查它是否具有任何属性。如果它没有,你可以删除它。
for(var prop in obj) {
if (obj.hasOwnProperty(prop)) {
//remove here
}
}
答案 3 :(得分:0)
抛开字符串操作是否是整理JSON数据的最佳方法的问题,您之前的尝试将删除所有大括号和逗号,因为正则表达式中的[]
表示&# 34;匹配这些括号内的任何字符&#34;。如果您尝试将其视为文字字符,则需要对其进行转义:\[
或\]
你需要像.replace(/{},?/g,"")
这样的东西(意思是&#34;匹配字符串{}
的所有实例或字符串{},
- 问号使前面的字符成为可选匹配)。
(当然,这会从字符串中删除所有空对象,并且有可能创建无效的JSON给定输入,如&#34; foo:{},bar:{}& #34; - 所以只有在你确定你的数据永远不会包含故意空对象时才使用它。)