【IE不支持for...in / Object.keys、Object.values、字符串索引undefined】兼容IE的对象(字典)遍历

ps:低版本不支持JSON.stringifyJSON.parse

👉👉👉JSON3库传送门:在线JSON兼容库

问题一:都知道,IE对for…in语法并不支持,强行使用便会产生各种问题

(function() {
	var obj = {
		key1 : 'val1',
		key2 : 'val2',
		key3 : 'val3'
	}
	
	//转换为JSON格式的字符串
	var json_str = JSON.stringify(obj);
	
	//转换为JSON格式
	var myJSON = JSON.parse(json_str);
	
	//使用for...in遍历
	var html = '<ul>'
	for (item in myJSON) {
		html += '<li>'+item+' : '+myJSON[item]+'</li>';
	}
	html += '</ul>';
	
	document.getElementById('demo').innerHTML = html;
})();

IE11~9会出现以下格式,IE8及以下直接报错不支持

在这里插入图片描述

问题二:IE8及以下版本不支持Object.keys、IE全版本都不支持Object.values

若不考虑 IE8 及以下版本的兼容问题,可使用Object.keys+for…length

(function() {
	var obj = {
		key1 : 'val1',
		key2 : 'val2',
		key3 : 'val3'
	}
	
	//转换为JSON格式的字符串
	var json_str = JSON.stringify(obj);
	
	//转换为JSON格式
	var myJSON = JSON.parse(json_str);
	
	//获取所有key
	var arr_keys = Object.keys(obj);
	
	//通过key遍历对应value(IE不支持for...in遍历)
	var html = '<ul>'
	for (var i=0; i<arr_keys.length; i++) {
		html += '<li>'+arr_keys[i]+' : '+myJSON[arr_keys[i]]+'</li>';
	}
	html += '</ul>';
	
	document.getElementById('demo').innerHTML = html;
})();

IE9正常显示

在这里插入图片描述

IE8及以下报错

在这里插入图片描述

超兼容写法一:分割 “,” 与 “:” 形成二维数组(别忘了JSON3库)

(function() {
	var obj = {
		key1 : 'val1',
		key2 : 'val2',
		key3 : 'val3'
	}
	
	//转换为JSON格式的字符串,并移除双引号(先split成数组,再join成字符串)
	var json_str = JSON.stringify(obj).split('"').join('');

	//移除花括号,并以','分割数组
	var json_arr = json_str.substring(1, json_str.length-1).split(',');

	var html = '<ul>';
	for (var i=0; i < json_arr.length; i++) {
		//以':'分割数组,并获取各项值
		var k = json_arr[i].split(':')[0];
		var val = json_arr[i].split(':')[1];

		html += '<li>' + k + ' : ' + val +'</li>';
	}
	html += '</ul>';

	document.getElementById('demo').innerHTML = html;
})();

在这里插入图片描述

====================>方法二冗余繁杂不推荐,仅供思路参考

超兼容写法二:将 “:” 替换为 “,” ,再分别填入数组,根据长度相等特性,一同遍历打印(别忘了JSON3库)

(function() {
	var obj = {
		key1 : 'val1',
		key2 : 'val2',
		key3 : 'val3'
	}
	
	//转换为JSON格式的字符串,并移除双引号(先split成数组,再join成字符串)
	var json_str = JSON.stringify(obj).split('"').join('');

	//定义一个空字符串
	var str='';

	//遍历重写字符串,替换冒号,移除花括号
	for (var n = 0; n < json_str.length; n++) {

		//注意:字符串在早期IE版本中不支持数组方式索引,不能写为str[i],应为str.charAt(i)

		//替换':'为','
		if (json_str.charAt(n) === ':') {
			//str += ',';
			str += json_str.charAt(n).replace(':', ',');

		//移除花括号
		} else if (json_str.charAt(n) === '{' || json_str.charAt(n) === '}') {
			str += '';
		
		//添加入字符串
		} else {
			str += json_str.charAt(n);
		}
	}

	//以','分割数组
	var arr = str.split(',');

	//分别定义用于存储key与value的空数组,并通过遍历填充
	var keys = [];
	var values = [];
	for (var i = 0; i < arr.length; i++) {
	
		//余为0则为偶数,即key
		if (i%2 === 0) {
			keys.push(arr[i]);
	
		//余不为0则为奇数,即value
		} else {
			values.push(arr[i]);
		}
	}

	var html = '<ul>';
	//因为keys与values等长,所以遍历其中一个数组长度即可
	for (var j = 0; j < keys.length; j++) {
		html += '<li>' + keys[j] + ' : ' + values[j] + '</li>';
	}
	html += '<ul>';

	document.getElementById('demo').innerHTML = html;
})();

在这里插入图片描述

谨慎掉坑:IE7及以下版本,字符串无法通过数组索引获取每个字符

问题:undefined

(function() {
	var str = 'Hello World';

	//IE7即以下,遍历数组,枚举会出现 undefined
	for (var i = 0; i < str.length; i++) {
		console.log(str[i]);
		//console.log(str.charAt(i));
	}
})();

在这里插入图片描述
在这里插入图片描述

解决:str[i] ==> charAt(i)

(function() {
	var str = 'Hello World';

	//IE7即以下,遍历数组,枚举会出现 undefined
	for (var i = 0; i < str.length; i++) {
		//console.log(str[i]);
		console.log(str.charAt(i));
	}
})();

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值