/**
?*?数组转换为字符串
?*?@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;
}