js-json、数组相关操作
一、json与字符串相互转换
字符串对象:(注意key值不加引号)
var jsonString = {
key1 : 'value1',
key2 : 'value2'
} ;
JSON.stringify(jsonObj);//json转字符串
JSON.parse(jsonString);//字符串转JSON
二、json与数组组合数据
var arr1 = []; //定义一个数组对象
arr1.push({ index: 1, value: '111' });
arr1.push({ index: 2, value: '222' });
var arr2 = [];
arr2.push({ index: 1, value: '1111' });
arr2.push({ index: 2, value: '2222' });
console.log("test arr1[0]相关数据 index=" + arr1[0].index);
console.log("test arr1[0]相关数据 value=" + arr1[0].value);
var jsonobj = {}; //定义一个json对象
jsonobj.res = false;
jsonobj.arr1 = arr1;
jsonobj.arr2 = arr2;
console.log("json转字符串=" + JSON.stringify(jsonobj));
/*console.log("字符串转JSON=" + JSON.parse(jsonString));*/
打印:
login.html:269 test arr1[0]相关数据 value=111
login.html:275 json转字符串={"res":false,"arr1":[{"index":1,"value":"111"},{"index":2,"value":"222"}],"arr2":[{"index":1,"value":"1111"},{"index":2,"value":"2222"}]}
三、数组push添加元素
var arrayObj = [ ];//定义数组
arrayObj.push({ name: "key" + index, path: "value" });//键值对方式
arrayObj.push(‘value1’,‘value2’);//都是值
四、数组删除元素
var textArr = ['a','b','c','d'];
这时我想删除这个数组中的b元素:
方法一:delete 删除数组
delete textArr[1] 结果为: ["a",undefined,"c","d"]
只是被删除的元素变成了 undefined 其他的元素的键值还是不变。
方法二:aplice 删除数组
splice(index,len,[item]) 注释:该方法会改变原始数组。
index:数组开始下标 len: 替换/删除的长度 item:替换的值,删除操作的话 item为空
textArr.splice(1,1); 结果为:["a","c","d"] 直接删除了数组 改变了数组的值。
五、清空数组
arrayObj.splice(0, arrayObj.length);
六、使用jQuery取data值并排序
//数组遍历及排序
var arr = [];
$(".ping").each(function(){
arr.push($(this).attr("data_order"));
});
arr.sort();
//根据业务需求自定义排序规则
function sortNumber(a,b){
return a - b
}
arr.sort(sortNumber)
七、数组中去除重复数据(过滤)
/**
* 去除重复照片,这里的splice(j, 1)中的j表示去掉新值,如果填i,表示去掉就值
*/
function filterRepeat(filesArr) {
for(var i = 0; i < filesArr.length - 1; i++) {
for(var j = i + 1; j < filesArr.length; j++) {
if(filesArr[i].path == filesArr[j].path) { !!!path换成要需要判断的key
filesArr.splice(j, 1);
filterRepeat(filesArr);//递归调用
}
}
}
return filesArr;
}
八、第二个数组中去除第一个数组中已存在的数据(如果是json数组,注意加上json key,暂不适合做公共方法)
var arr = [22, 33];
var arrDest = [11, 22, 33];
function filterArrayExceptFirst(arr, arrDest) {
for (var i = 0, leni = arr.length; i < leni; i++) {
splicedata(arr[i], arrDest);//arr[i] 根据需要需求加 json key
}
return arrDest;
}
function splicedata(arrdata, arrDest) {
if (!arrDest) {
return;
}
for (var j = 0, lenj = arrDest.length; j < lenj; j++) {
if (!arrDest || !arrDest[j]) {
return;
}
console.log("-----" + JSON.stringify(arrDest[j]));
if (arrdata == arrDest[j]) {//arrDest[j] 根据需要需求加 json key
arrDest = arrDest.splice(j, 1);
console.log("-----" + j);
splicedata(arrDest);
}
}
}
console.log("-----" + filterArrayExceptFirst(arr, arrDest));
九、关于json中动态设置key值的说明(相当于把{}转成数组了)
key值动态设置用[ ],取值也用[ ]
var jsonobj = {};
var keyobj="thisiskey";
jsonobj[keyobj] ="this is value";
console.log('test:' + jsonobj.thisiskey);
var keynew = getKey(keyobj);
console.log('test:' + jsonobj[keynew]);
function getKey(p) {
if(p.indexOf('"') == 0) {
return p.substring(0, p.length);
} else {
return p;
}
}
补充:在js操作style时, xxxObj.style.width=''20''+px;
也可以使用 xxxObj.style["width"] = ''20''+px;
html中的DOM对象实质就是json对象
遍历json使用 for-in,(扩展:php中使用for-as)
var json = {a:12,b:34};
for(var index in json ){
console.log("the key:"+index+",the value:"+json[index ]);
}
十、数组合并相关
1、concat
js的Array对象提供了一个叫concat()方法,连接两个或更多的数组,并返回结果。
var c = a.concat(b);
2、for循环
大概的思路是:遍历其中一个数组,把该数组中的所有元素依次添加到另外一个数组中。直接上代码:
for(var i in b){
a.push(b[i]);
}
这样的写法可以解决第一种方案中对内存的浪费,但是会有另一个问题:丑!这么说不是没有道理,如果能只用一行代码就搞定,岂不快哉~
3、apply
函数的apply方法有一个特性,那就是func.apply(obj,argv),argv是一个数组。所以我们可以利用这点,直接上代码:
a.push.apply(a,b);
调用a.push这个函数实例的apply方法,同时把,b当作参数传入,这样a.push这个方法就会遍历b数组的所有元素,达到合并的效果。
这里可能有点绕,我们可以把b看成[4,5,6],变成这样:
a.push.apply(a,[4,5,6]);
然后上面的操作就等同于:
a.push(4,5,6);
这样就很清楚了!
另外,还要注意两个小问题:
1)以上3种合并方法并没有考虑过a、b两个数组谁的长度更小。
所以好的做法是预先判断a、b两个数组哪个更大,然后使用大数组合并小数组,这样就减少了数组元素操作的次数!
2)有时候我们不希望原数组(a、b)改变,这时就只能使用concat了。
十一、json数组排序(苹果环境下 sort方法无效,需要重写)
var data = [ {"key":"a"}, {"key":"b"}, {"key":"c"}]
data.sort( function(a,b){//data此时已经是排序后的对象
return a.key-b.key;//字符号好像不需要强制转成int,结果: -1 0 1(要通过计算返回取到 -1 0 1)
});
示例:
function _sortData(data) {
if(!data) {
return data;
}
//按照时间和_stateflag值都降序排列,最终只要一个return
data.sort(function(a, b) { //data此时已经是排序后的对象
var _stateflag = _getstateflag(b.ManTaskState, a.TaskState);
if(checkDateValid(b.TaskDealDatetime, a.TaskDealDatetime) && _stateflag == 0) {
return -1;
} else if(checkDateValid(b.TaskDealDatetime, a.TaskDealDatetime) == false && _stateflag == 2) {
return 1;
} else {//加上&&条件,让整体判断有机会往下走
if(_stateflag == 0) {
return -1;
} else if(_stateflag == 1) {
return 0;
} else { //2
return 1;
}
}
});
}
更多访问 http://blog.csdn.net/salonzhou/article/details/50801745
重写sort方法:
;(function(w) {
var _sort = Array.prototype.sort;
Array.prototype.sort = function(fn) {
if(!!fn && typeof fn === 'function') {
if(this.length < 2) return this;
var i = 0,
j = i + 1,
l = this.length,
tmp, r = false,
t = 0;
for(; i < l; i++) {
for(j = i + 1; j < l; j++) {
t = fn.call(this, this[i], this[j]);
r = (typeof t === 'number' ? t : !!t ? 1 : 0) > 0 ? true : false;
if(r) {
tmp = this[i];
this[i] = this[j];
this[j] = tmp;
}
}
}
return this;
} else {
return _sort.call(this);
}
};
})(window);
十二、把一个数组赋值另一个数组
arr1 = arr2;//某些情况会出错
优化:
arr1= arr2.slice(); //使用前不要对arr1 splice清空数组
//注意arr2是数据源,不要写成arr1= arr1.slice(arr2)!
正文到此结束
- 本文标签: JavaScript
- 本文链接: https://code.jiangjiesheng.cn/article/89
- 版权声明: 本文由小江同学原创发布,转载请先联系本站长,谢谢。