결합 된 데이터 값의 배열 같은 객체 - 재귀 함수 문구

  관리 시스템은 우리가 아래와 같이 많은 요구가, 양식 데이터를 병합 할 필요가 충족되는 시간을 많이 할 :

  

  상기 예에서는, 데이터가 평평 할 수있다 수득 유사한 행

[{
		'品类':'帽子/针织/长巾',
		'配色/尺码':'红褐色/L',
		'生产计划数':'800顶',
		'纱线':'42支哔哩啪啦',
		'颜色':'蓝色',
		'重量':'10千克'
	},{
		'品类':'帽子/针织/长巾',
		'配色/尺码':'红褐色/L',
		'生产计划数':'800顶',
		'纱线':'32支哔哩啪啦',
		'颜色':'蓝色',
		'重量':'10千克'
	},{
		'品类':'帽子/针织/长巾',
		'配色/尺码':'红褐色/L',
		'生产计划数':'800顶',
		'纱线':'42支哔哩啪啦',
		'颜色':'紫色',
		'重量':'10千克'
	},{
		'品类':'帽子/针织/长巾',
		'配色/尺码':'红褐色/L',
		'生产计划数':'800顶',
		'纱线':'42支哔哩啪啦',
		'颜色':'紫色',
		'重量':'10千克'
	}]
...........

  데이터가 통합 될 수있다, 즉 찾기 어려울이 평면 어레이 상기 데이터의 상당한 중복이 있고, 우리는 동일한 데이터 값이 병합 된 부분이다, 예를 들면, 우리는 크기에 따라 그 후, 동일 데이터 종류를 병합하고자 할 수 / 동일한 데이터는 또한 결합 된 색상 ..........

  마지막으로 우리는 폼을 표시 할 필요가의 합병 후 다층 구조의 객체를 얻는다.

  여기에 아래의 예에서 볼 수 필요가 이차원 코드의 왼쪽 모서리 상단을 청소 할 수 있습니다 논의 할 코드의 뒤쪽 부분은, 몇 가지 생각을 주석으로이 데이터를 병합 할 수 있습니다 플랫 기능을 제공합니다

<script type="text/javascript">

let json = [{
	sex:'女',
	name:'女1号',
	from:'中国'
},{
	sex:'女',
	name:'女2号',
	from:'中国'
},{
	sex:'女',
	name:'女3号',
	from:'韩国'
},{
	sex:'男',
	name:'男1号',
	from:'中国'
},{
	sex:'男',
	name:'男2号',
	from:'韩国'
},{
	sex:'男',
	name:'男3号',
	from:'美国'
},{
	sex:'男',
	name:'男4号',
	from:'中国'
}]

function jsonMerge(jsonArr,keyArr){
	let newJson = [] //合并好的数据都放在这个数组里
	jsonArr.forEach((itemJson,indexJson)=>{
		let mark = -1
		let finded = newJson.find((itemFind, indexFind) => {
			if (itemFind[keyArr[0]] === itemJson[keyArr[0]]) {
				mark = indexFind
				return itemFind[keyArr[0]] === itemJson[keyArr[0]]
			}
		})
		if(!finded){
			let value = {}
			value[keyArr[0]] = itemJson[keyArr[0]]
			value['info'] = []
			let info = {}
			for(let i in itemJson){
				if(i!==keyArr[0]){
					info[i] = itemJson[i]
				}
			}
			value['info'].push(info)
			newJson.push(value)
		}else{
			let info = {}
			for(let i in itemJson){
				if(i!==keyArr[0]){
					info[i] = itemJson[i]
				}
			}
			newJson[mark]['info'].push(info)
		}
	})
	// 递归的条件是不断的缩减keyArr的length,每次都去除第零个,直到为0
	if(keyArr.length === 1){
		return newJson
	}else{
		return newJson.map((itemInfo)=>{
			let newKeyArr = []
			keyArr.forEach((item,index)=>{
				if(index>0){
					newKeyArr.push(item)
				}
			})
			return{
				[keyArr[0]]:itemInfo[keyArr[0]],
				'info':jsonMerge(itemInfo['info'],newKeyArr)
			}
		})
	}
}

console.log(jsonMerge(json,['sex','from']))

// function jsonMerge(jsonArr,key,newKey){
// 	let json = jsonArr
// 	let newJson = []
// 	json.forEach((item,index)=>{
// 		let mark = -1
// 		let finded = newJson.find((itemFind,indexFind)=>{
// 			if(itemFind[key]===item[key]){
// 				mark = indexFind
// 				return itemFind[key]===item[key]
// 			}
// 		})
// 		if(!finded){
// 			let value = {}
// 			value[key] = item[key]
// 			value[newKey] = []
// 			let itemJson = {}
// 			for(i in item){
// 				if(i!==key){
// 					itemJson[i] = item[i]
// 				}
// 			}
// 			value[newKey].push(itemJson)
// 			newJson.push(value)
// 		}else{
// 			let itemJson = {}
// 			for(i in item){
// 				if(i!==key){
// 					itemJson[i] = item[i]
// 				}
// 			}
// 			newJson[mark][newKey].push(itemJson)
// 		}
// 	})
// 	return newJson
// }
// let sexMerge = jsonMerge(json,'sex','arr')
// let fromMerge = jsonMerge(json,'from','arr')
// console.log(sexMerge,fromMerge)
/*
	目前能根据单个key进行合并,如我需要合并key值sex,就可以得到
	json = [{
		sex:'女',
		info:[{
			name:'女一号',
			from:'中国'
		},{
			name:'女二号',
			from:'中国'
		} ...]
	},{
		sex:'男',
		info:[{
			name:'男一号',
			from:'中国'
		},{
			name:'男二号',
			from:'韩国'
		} ...]
	}]	

	我想实现的效果,根据多个key进行合并,如我先合并key值sex相同的数据,再合并from相同的数据
	json = [{
		sex:'女',
		info:[{
			from:'中国',
			info:[{
				name:'女1号'
			},{
				name:'女2号'
			}...]
		},{
		sex:'女',
		info:[{
			from:'韩国',
			info:[{
				name:'女3号'
			},{
				name:'女4号'
			}...]
		}]
*/
</script>

다음과 같이 최종 결과는

게시 된 109 개 원래 기사 · 원 찬양 196 ·은 30 만 + 조회수

추천

출처blog.csdn.net/dkr380205984/article/details/90699296