再帰関数文言 - 複合データ値の配列で同一のオブジェクト

  下に示すように、管理システムでは、我々は多くの要求を満たすだろう多くの時間は、フォームデータをマージする必要があります:

  

  上記の例では、我々は次のように、データは平坦であってもよい得

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

  データをマージすることができ、すなわち見つけることは困難で、この平坦なアレイ上のデータのかなりの重複があり、我々は、同じデータ値が、マージされた部分であり、例えば、我々はサイズに応じて、その後、同一のデータカテゴリをマージしたい場合があります/同じデータは、また、合成色である..........

  最後に、フォームを表示する必要があるの合併後の多層構造のオブジェクトを取得します。

  ここで私は、以下の例を見ることができ、コードの背面部分を議論するためのいくつかの考えは、2次元コードの左上隅を掃除することができますコメントしている必要があり、フラットな機能は、データをマージすることができます

<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