解决方案如下:
var json = {};
json.removeExtComma = function (str) {
var i,
j,
len,
list,
c,
notValue = null,
preQuot = null,
lineNum;
list = String(str).split('');
for(i=0,len=list.length;i<len;i++){
c = list[i];
//单引或双引
if(/^[\'\"]$/.test(c)){
if( notValue === null && preQuot === null) {
notValue = false;
preQuot = i;
continue;
}
//值
if(!notValue){
//前面反斜杠个数
lineNum = 0;
for(j = i-1 ; j >-1 ;j --){
if(list[j] === '\\') {lineNum++;}
else { j=-1; }
}
//个数为偶数且和开始引号相同
//结束引号
if(lineNum % 2 === 0){
if(list[preQuot] === c) {
notValue = true;
preQuot = -1;
}
}
}
//非值
else {
//开始引号
if(preQuot == -1) {
preQuot = i;
notValue = false;
}
//结束引号
else if(list[preQuot] === c) {
notValue = true;
preQuot = -1;
}
}
}
//逗号
else if(c === ']' || c === '}'){
//非值
if(notValue){
for(j = i-1 ; j >-1 ;j --){
if(/^[\t\r\n\s ]+$/.test(list[j])) {continue;}
else { if(list[j] === ',') list[j] = ''; break; }
}
}
}
}
return list.join('');
}
原创部分结束,以下部分转载自:http://heeroluo.net/ShowArticle84.aspx 多余的逗号
JSON
在JSON格式中,逗号是多个属性键值对间的分隔符,例如:
var json = { id: 1, name: 'heero' };
但在编程的时候,很容易会画蛇添足,在最后一对键值对后也加上了逗号:
var json = { id: 1, name: 'heero', };
在这种情况下,IE6、7会报错,但IE8以及其他浏览器则没有问题。
数组
在数组中,逗号是元素间的分隔符,例如:
var arr = [1, 2, 3];
同样地,我们也有可能不小心在最后一个元素后加了逗号:
var arr = [1, 2, 3,];
凭直觉来说,这应该是错误的语法。但实际上,所有浏览器都对这种情况实现了兼容,包括IE6。考虑这样一段示例代码:
var arr = [1, 2, 3,];
for (var i = 0; i < arr.length; i++) { alert(arr[i]); }
在IE以外的浏览器上,均依次输出1、2、3;但在IE浏览器上,却是依次输出1、2、3、undefined。明显地,IE在那个多余的逗号后加了一个undefined元素。
再考虑另一种情况,多余的逗号不在末尾,而是在中间:
var arr = [1, 2,, 3,];
for (var i = 0; i < arr.length; i++) { alert(arr[i]); }
所有浏览器均输出1、2、undefined、3,可见处理方式是一样的,就是在多余的逗号前插入一个undefined元素。