使用jq js, json数组操作总结,实现两个json数组生成差集的数组,生成id相同对象不相等的数组。

描述与注意事项

`本文使用的是jquery-1.9.1.js记得导入!

从两个json数组,A、B数组中找出B对于A不相等的对象生成数组,并找出B相对于A新增的json对象生成数组。
`

背景

作者在使用bootstrap-table插件时遇到一个需求,动态修改表格后的数据直接进行保存,所以要使用json数组比较,删除没有写入,因为删除功能为直接物理删除行数据,从一下方法中可以获得修改后的数组和新增的数组。

测试数据

//测试数据,新增了id=5的对象,修改了id=1的姓名 id=2的职业。getJsonArray为获得的原始数组,editedJsonArray为修改新增后的数组。
var getJsonArray =
[
    {
        "姓名": "A",
        "职业": "文员",
        "id": 1
    },
	    {
        "姓名": "B",
        "职业": "文员",
        "id": 2
    },
    {
        "姓名": "C",
        "职业": "小摊老板",
        "id": 3
    }
]
var editedJsonArray = 
[
    {
        "姓名": "F",
        "职业": "文员",
        "id": 1
    },
	    {
        "姓名": "B",
        "职业": "X",
        "id": 2
    },
    {
        "姓名": "C",
        "职业": "小摊老板",
        "id": 3
    },
	{
        "姓名": "D",
        "职业": "码农",
        "id": 5
    }
]	

使用到的方法和总结

1.返回json数组id

var newJsonIdArray = [];
$.each(newJsonArray, function (i, n)
{
  newJsonIdArray.push(n.id);
});

2.json id数组之间差集

//输入两数组id,返回两json数组之间的差集
function getAddIdArray(oldJsonIdArray,newJsonIdArray){
//返回新增的id 数组AddIdArray
var AddIdArray = [];
  for(key in newJsonIdArray) {
  var stra = newJsonIdArray[key];
  var count = 0;
  for(var j = 0; j < oldJsonIdArray.length; j++) {
    var strb = oldJsonIdArray[j];
    if(stra == strb) {
      count++;
    }
  }
  if(count === 0) { //表示数组1的这个值没有重复的,放到AddIdArray数组中 
  AddIdArray.push(stra);
    }
  }return AddIdArray;
};

3.根据id数组生成新数组

//输入json数组和id数组,返回含有对应id的对象的json数组
function NewJsonArraryByIdArray(jsonArray,IdArray){
var NewJsonArraryByIdArray = [];
for(var i = 0;i< jsonArray.length;i++){	
 for(var j = 0;j<IdArray.length;j++){	
 if(jsonArray[i].id===IdArray[j]){	
	NewJsonArraryByIdArray.push(jsonArray[i]);//push对象生成新数组
 }
}
}return NewJsonArraryByIdArray;
};

4.判断json对象相等

//比较两个json 对象是否完全相等,返回true、false。
function isObj(object) {
        return object && typeof (object) == 'object' && Object.prototype.toString.call(object).toLowerCase() == "[object object]";
    }

function isArray(object) {
        return object && typeof (object) == 'object' && object.constructor == Array;
    }

function getLength(object) {
        var count = 0;
        for (var i in object) count++;
        return count;
    }
function Compare(objA, objB) {
        if (!isObj(objA) || !isObj(objB)) return false; //判断类型是否正确
        if (getLength(objA) != getLength(objB)) return false; //判断长度是否一致
        return CompareObj(objA, objB, true);//默认为true
    }
function CompareObj(objA, objB, flag) {
        for (var key in objA) {
            if (!flag) //跳出整个循环
                break;
            if (!objB.hasOwnProperty(key)) { flag = false; break; }
            if (!isArray(objA[key])) { //子级不是数组时,比较属性值
                if (objB[key] != objA[key]) { flag = false; break; }
            } else {
                if (!isArray(objB[key])) { flag = false; break; }
                var oA = objA[key], oB = objB[key];
                if (oA.length != oB.length) { flag = false; break; }
                for (var k in oA) {
                    if (!flag) //这里跳出循环是为了不让递归继续
                        break;
                    flag = CompareObj(oA[k], oB[k], flag);
                }
            }
        }
        return flag;
    }
};

5.去重

//删除数组json中重复的元素或者对象,返回json数组
function deteleObject(obj) {
            var uniques=[];
            var stringify = {};
            for(var i=0; i<obj.length; i++) {
                var keys = Object.keys(obj[i]);
                keys.sort(function(a, b) {
                    return (Number(a) - Number(b));
                });
                var str='';
                for(var j=0; j < keys.length; j ++) {
                    str += JSON.stringify(keys[j]);
                    str += JSON.stringify(obj[i][keys[j]]);
                }
                if(!stringify.hasOwnProperty(str)) {
                    uniques.push(obj[i]);
                    stringify[str]=true;
                }
            }
            return uniques;
        }

6.返回update的数组

//输入两个的json数组,oldJsonArray,newJsonArray,获取相同id的数组,如果newjsonarrey对应id下对象不相等,生成对象不相等的json数组。里面使用了去重方法deteleObject(obj) 。
function updateArraryAfterEdited(oldJsonArray,newJsonArray){
//返回修改后的id数组editIdArray
var newJsonIdArray = [];
$.each(newJsonArray, function (i, n)
{
  newJsonIdArray.push(n.id);
});
//返回数据库的id数组OldIdArray
var oldJsonIdArray = [];
$.each(oldJsonArray, function (i, n)
{
  oldJsonIdArray.push(n.id);
});
//返回相同的id数组SameIdArray   
var SameIdArray =[];
for(key in oldJsonIdArray){
  var stra = oldJsonIdArray[key];
  var count = 0;
  for(var j = 0; j < newJsonIdArray.length; j++) {
    var strb = newJsonIdArray[j];
    if(stra == strb) {
SameIdArray.push(stra);
   }
  }
}
//分别对比id对应的数组内的对象,结果不相同返回数组
var getJsonArrayBySameId =NewJsonArraryByIdArray(getJsonArray,SameIdArray);
var eidtedJsonArrayBySameId =NewJsonArraryByIdArray(editedJsonArray,SameIdArray);
 var diffArray= [];
for(var i = 0;i< getJsonArrayBySameId.length;i++){	
 for(var j = 0;j<eidtedJsonArrayBySameId.length;j++){	
  result = Compare(eidtedJsonArrayBySameId[j], getJsonArrayBySameId[i])
 if(result === false){	
	if(getJsonArrayBySameId[i].id === eidtedJsonArrayBySameId[j].id){	
	diffArray.push(eidtedJsonArrayBySameId[i]);
   }
	
   }
 }
}var updateArraryAfterEdited = deteleObject(diffArray);//遍历后去掉重复的对象,返回结果不同被修改的数组,update
 return updateArraryAfterEdited;
}

7.输入两组json数组返回差集

//输入两组json数组返回差集,调用了getAddIdArray,NewJsonArraryByIdArray
function getAddArray(oldJsonArray,newJsonArray){
//返回修改后的id数组editIdArray
var newJsonIdArray = [];
$.each(newJsonArray, function (i, n)
{
  newJsonIdArray.push(n.id);
});
//返回数据库的id数组OldIdArray
var oldJsonIdArray =[];
$.each(oldJsonArray, function (i, n)
{
  oldJsonIdArray.push(n.id);
//获得添加后的idArray
});
var  AddIdArray = getAddIdArray(oldJsonIdArray,newJsonIdArray);
var addJsonArray = NewJsonArraryByIdArray(newJsonArray,AddIdArray);
return addJsonArray;

获得新增的数组

步骤与对应方法

1.获得id

2.获得id之间的差集

3.根据id数组生成新数组

//主方法,输入两组json数组返回差集,调用了getAddIdArray,NewJsonArraryByIdArray
function getAddArray(oldJsonArray,newJsonArray){
    //返回修改后的id数组editIdArray
var newJsonIdArray = [];
$.each(newJsonArray, function (i, n)
{
  newJsonIdArray.push(n.id);
});
    //返回数据库的id数组OldIdArray
var oldJsonIdArray =[];
$.each(oldJsonArray, function (i, n)
{
  oldJsonIdArray.push(n.id);
    //获得添加后的idArray
});
var  AddIdArray = getAddIdArray(oldJsonIdArray,newJsonIdArray);
var addJsonArray = NewJsonArraryByIdArray(newJsonArray,AddIdArray);
return addJsonArray;

获得修改过的的数组

步骤与对应方法

1.获得id

2.获得交集

3.比较对象返回数组

//输入两个的json数组,oldJsonArray,newJsonArray,获取相同id的数组,如果newjsonarrey对应id下对象不相等,生成对象不相等的json数组。里面使用了去重方法deteleObject(obj) 。
function updateArraryAfterEdited(oldJsonArray,newJsonArray){
//返回修改后的id数组editIdArray
var newJsonIdArray = [];
$.each(newJsonArray, function (i, n)
{
  newJsonIdArray.push(n.id);
});
//返回数据库的id数组OldIdArray
var oldJsonIdArray = [];
$.each(oldJsonArray, function (i, n)
{
  oldJsonIdArray.push(n.id);
});
//返回相同的id数组SameIdArray   
var SameIdArray =[];
for(key in oldJsonIdArray){
  var stra = oldJsonIdArray[key];
  var count = 0;
  for(var j = 0; j < newJsonIdArray.length; j++) {
    var strb = newJsonIdArray[j];
    if(stra == strb) {
SameIdArray.push(stra);
   }
  }
}
//分别对比id对应的数组内的对象,结果不相同返回数组
var getJsonArrayBySameId =NewJsonArraryByIdArray(getJsonArray,SameIdArray);
var eidtedJsonArrayBySameId =NewJsonArraryByIdArray(editedJsonArray,SameIdArray);
 var diffArray= [];
for(var i = 0;i< getJsonArrayBySameId.length;i++){	
 for(var j = 0;j<eidtedJsonArrayBySameId.length;j++){	
  result = Compare(eidtedJsonArrayBySameId[j], getJsonArrayBySameId[i])
 if(result === false){	
	if(getJsonArrayBySameId[i].id === eidtedJsonArrayBySameId[j].id){	
	diffArray.push(eidtedJsonArrayBySameId[i]);
   }
	
   }
 }
}var updateArraryAfterEdited = deteleObject(diffArray);//遍历后去掉重复的对象,返回结果不同被修改的数组,update
 return updateArraryAfterEdited;
}

调用代码与返回值

//调用方法
$(function(){
var a = getAddArray(getJsonArray,editedJsonArray);
console.log(a);//控制台输出返回的数据
var b =updateArraryAfterEdited(getJsonArray,editedJsonArray);
console.log(b);//控制台输出返回的数据
});

上面是新增,下面是修改过的数据,与测试数据描述一致
在这里插入图片描述

参考

在网吧码的忘记没有保存大佬写过的代码,之后会慢慢补上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值