工作中对象数组常见的一些操作
在很多时候,我们获取一个列表的时候,后端返回的列表都是对象数组,如果单纯的展示,那很简单,但往往回去做一些二次加工,比如选择商品,并对其数量或者价格做修改,而且还会重新选择,但是之前选好的已经修改了一些属性,我们就需要将两次选择的数据进行合并。等等。。
数组拷贝
首先讲一下数组拷贝问题,这里不细说怎么拷贝,而是提醒大家,在对数组进行传递并修改时一定要对数组拷贝,不然会发生意想不到的错误(在另一个地方修改了数组,之前的也变化了)。大家都知道数组是属于引用类型变量,所以传递的时候传递的是引用地址。记得拷贝,记得拷贝,一定要记得拷贝!(我一般使用slice来处理)
对数组添加额外属性
function addKey(list, keyword, value){
if(Object.prototype.toString.call(list) !== "[object Array]"){
return [];
}
var list = list.slice();
if(list.length == 0){
return [];
}
var newList = list.map(function(item, index){
if(typeof item[keyword] == "undefined"){
item[keyword] = value || "";
}
return item;
})
return newList || [];
}
合并数组
function merge(oldList, newList, keyword){
if(Object.prototype.toString.call(oldList) !== "[object Array]" || Object.prototype.toString.call(newList) !== "[object Array]"){
return;
}
//在这里为了方便做新旧数组对比,我们先做了一些处理,以关键字和商品信息为键值对来保存两组数据
var oldJson = formatArr(oldList.slice(), keyword);
var newJson = formatArr(newList.slice(), keyword);
var newArr = [];
for(var key in newJson){
if(typeof oldJson[key] !== "undefined"){
newArr.push(oldJson[key]);
}else{
newArr.push(newJson[key]);
}
}
return newArr;
}
function formatArr(list, keyword){
if(Object.prototype.toString.call(list) !== "[object Array]"){
return;
}
var list = list.slice();
var newJson = {};
list.forEach(function(item, index){
newJson[item[keyword]] = item;
})
return newJson;
}
github上有详细注释如何使用https://github.com/Stevenzwzhai/plugs/tree/master/Array-Deal