文章目录
描述与注意事项
`本文使用的是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);//控制台输出返回的数据
});
上面是新增,下面是修改过的数据,与测试数据描述一致
参考
在网吧码的忘记没有保存大佬写过的代码,之后会慢慢补上。