/**
* 数组转换为字符串
* @param {Array} arr
*/
function getSingleString(arr, keys, childKey) {
let newData = [];
// 整理数组
newData = newData.concat(getChildArr(arr, keys, childKey));
// 排序
const result = newData.flat(Infinity).sort((a, b) => a[keys[0]] - b[keys[0]]);
// 输出字符串 `${f.id}-${f.type}-${f.year}`
return result.map(f => {
return Object.values(f).join('-')
}).join(',').trim();
}
/**
* 整理数组中的层级关系
* @param {Array} arr
* @param {Array} keys 需要获取的字段列表
* @param {String} childKey 子级字段名称
*/
function getChildArr(arr, keys, childKey) {
if (arr && arr.length) {
return arr.map(f => {
let _obj = {};
if (keys && keys.length) {
keys.forEach(k => {
_obj[k] = f[k]
});
} else {
// 默认全部
_obj = f;
}
let temp = [_obj];
// 子级默认名称为children
childKey = childKey ? childKey : 'children';
if (f[childKey] && f[childKey].length) {
temp = temp.concat(getChildArr(f[childKey],keys, childKey))
}
return temp;
})
}
}
/**
* 数组转换为对象
* @param {Array} arr
*/
function getSingleObject(arr, keys, childKey) {
let newData = [];
// 整理数组
newData = newData.concat(getChildArr(arr, keys, childKey));
// 排序 按照keys中第一个字段排序
const result = newData.flat(Infinity).sort((a, b) => a[keys[0]] - b[keys[0]]);
// 输出字符串 `${f.id}-${f.type}-${f.year}`
let resultObject={}
result.forEach(f => {
const _vals=Object.values(f);
resultObject[_vals[0]]=_vals.join('-');
})
return resultObject;
}
/**
* 比较两个数据是否相等
* @param {Array} arr1
* @param {Array} arr2
* @param {Array} keys 数组中需要比较的字段列表,0位为唯一标识
* @param {String} childkey
*/
export function isEqual(arr1, arr2, keys, childKey) {
const str1 = getSingleString(arr1, keys, childKey);
const str2 = getSingleString(arr2, keys, childKey);
console.log('str1 :>> ', str1);
console.log('str2 :>> ', str2);
return str1 === str2;
}
/**
* 比较两个数据 返回每条记录比对结果
* @param {Array} arr1
* @param {Array} arr2
* @param {Array} keys 数组中需要比较的字段列表,0位为唯一标识
* @param {String} childkey
*/
export function getEqualInfo(arr1,arr2,keys,childkey){
const info1=getSingleObject(arr1,keys,childkey);
const info2=getSingleObject(arr2,keys,childkey);
console.log('info1 :>> ', info1);
console.log('info2 :>> ', info2);
let changeInfo={};
Object.keys(info1).forEach(key=>{
changeInfo[key]=info1[key]===info2[key];
})
return changeInfo;
}