工作中对象数组常见的一些操作

在很多时候,我们获取一个列表的时候,后端返回的列表都是对象数组,如果单纯的展示,那很简单,但往往回去做一些二次加工,比如选择商品,并对其数量或者价格做修改,而且还会重新选择,但是之前选好的已经修改了一些属性,我们就需要将两次选择的数据进行合并。等等。。

数组拷贝

首先讲一下数组拷贝问题,这里不细说怎么拷贝,而是提醒大家,在对数组进行传递并修改时一定要对数组拷贝,不然会发生意想不到的错误(在另一个地方修改了数组,之前的也变化了)。大家都知道数组是属于引用类型变量,所以传递的时候传递的是引用地址。记得拷贝,记得拷贝,一定要记得拷贝!(我一般使用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

原文地址:https://www.cnblogs.com/Upton/p/6441692.html