如何从混合内容数组中提取带{}的JSON对象?
解决数组中提取动态数量对象的问题
首先得指出你代码里的两个关键问题:
- 原始数组定义不合法:你写的
array = a,b,c,{"A":"0","f":"1","g":"2"},{"B":"5","v":"8","x":"4"},{"C":"0","f":"1","g":"2"},c,b不是标准的JavaScript数组写法,正确的数组需要用[]包裹所有元素,比如:// 先假设a、b、c是已定义的变量(比如字符串类型) var a = 'a', b = 'b', c = 'c'; var array = [a, b, c, {"A":"0","f":"1","g":"2"},{"B":"5","v":"8","x":"4"},{"C":"0","f":"1","g":"2"}, c, b]; - 错误使用
split方法:split是字符串专属方法,你数组里的元素是混合类型(普通变量和对象),对象本身没有split方法,而且你的目标是筛选对象,不是拆分字符串,这步操作完全没必要。
正确解决方案:筛选数组中的对象
我们可以遍历数组,判断每个元素是否为对象(同时排除null,因为typeof null也会返回object),把符合条件的元素收集到新数组中。
方法1:使用for循环(兼容性好)
var a = 'a', b = 'b', c = 'c'; var array = [a, b, c, {"A":"0","f":"1","g":"2"},{"B":"5","v":"8","x":"4"},{"C":"0","f":"1","g":"2"}, c, b]; var result = []; for (var i = 0; i < array.length; i++) { // 检查元素是否是对象且不为null if (typeof array[i] === 'object' && array[i] !== null) { result.push(array[i]); } } console.log(result); // 输出:[ {"A":"0","f":"1","g":"2"},{"B":"5","v":"8","x":"4"},{"C":"0","f":"1","g":"2"} ]
方法2:使用filter方法(更简洁,ES6+适用)
如果你的运行环境支持ES6及以上版本,可以用数组的filter方法一行完成筛选:
var result = array.filter(item => typeof item === 'object' && item !== null);
特殊情况:如果你的"数组"其实是字符串
如果原始数据实际是一个字符串(比如var array = "a,b,c,{\"A\":\"0\",\"f\":\"1\",\"g\":\"2\"},{\"B\":\"5\",\"v\":\"8\",\"x\":\"4\"},{\"C\":\"0\",\"f\":\"1\",\"g\":\"2\"},c,b"),那需要先拆分字符串,再识别并解析JSON对象:
var str = "a,b,c,{\"A\":\"0\",\"f\":\"1\",\"g\":\"2\"},{\"B\":\"5\",\"v\":\"8\",\"x\":\"4\"},{\"C\":\"0\",\"f\":\"1\",\"g\":\"2\"},c,b"; var parts = str.split(','); var result = []; var currentObjStr = ''; var inObj = false; for (var part of parts) { if (part.includes('{')) { inObj = true; currentObjStr += part; } else if (part.includes('}')) { inObj = false; currentObjStr += ',' + part; // 解析JSON字符串为对象 result.push(JSON.parse(currentObjStr)); currentObjStr = ''; } else if (inObj) { currentObjStr += ',' + part; } } console.log(result);
根据你的描述,应该是数组混合了变量和对象的场景,第一种方法就可以完美满足你的需求。
内容的提问来源于stack exchange,提问作者faezanehhabib
相关产品推荐
相关产品推荐

