JS对象数组中依据某个属性的值分组

问题:需要在对象数组中根据某个属性值进行归类或者分组

const dataList = [
	{
		name: 'Apple',
		type: 'Fruit',
		price: '¥1.5'
	},
	{
		name: 'Banana',
		type: 'Fruit',
		price: '¥3.5'
	},
	{
		name: 'Grape',
		type: 'Fruit',
		price: '¥2.5'
	},
	{
		name: 'Cabbage',
		type: 'Vegetable',
		price: '¥2.5'
	},
	{
		name: 'Tomoto',
		type: 'Vegetable',
		price: '¥5.5'
	}
]
// 需要根据 type为Fruit 和 Type为Vegetable 的两种类型来分组,也就是说将同类的放到一组中,
// 当然 type还可以是其他比如:Food,那么如何实现?

代码实现:方法1

function handleSameTypeGroup(dataList, name = 'type') {

	let list = [] // 定义空数据用于存放同类type数据
	let obj = {} // 定义空对象用于获取同类type数据
	
	if (dataList.length > 0) {
		for (let item of dataList) {
			if (obj['group_' + item.type]) {
				obj['group_' + item.type].push(item)
			} else {
				obj['group_' + item.type] = [item]
			}
		}
		for (let key in obj) {
			list.push({
				[name]: obj[key]
			})
		}
	}
	return list
}
// 执行函数
handleSameTypeGroup(dataList)

JS对象数组中依据某个属性的值分组_第1张图片

JS对象数组中依据某个属性的值分组_第2张图片
然后我们要获取的时候.type(因为返回的是一个对象数组,但是对象中又嵌套了一层key为type值为数组的对象),然后遍历,就可以获取里面的每一项了。

代码实现:方法2 (递归)

function handleSameTypeList(list, name, resultList){
  // 每一个类型的单独数组,注意此处不能return出每个sameTypeArr,
  // 因为递归的返回值只返回最后一次的值
  let sameTypeList = []
  let propVal = ''
  
  if (list.length > 0) {
    propVal = list[0][`${name}`]
    let tempList = []
    // 将含有相同的name属性值的对象push到此次遍历的list中,
    // 将其他的对象放入到tempList中,下次遍历
    list.forEach((item, key) => {
      if (item[`${name}`] === propVal) {
        sameTypeList.push(item)
      } else {
        tempList.push(item)
      }
    })
    resultList.push(sameTypeList)
    list = tempList
    return handleSameTypeList(list, name, resultList)
  } else {
    return resultList
  }
}

var list = handleSameTypeList(dataList, 'type', [])
console.log(list)
for (let item of list) {
	console.log(item)
}

JS对象数组中依据某个属性的值分组_第3张图片

你可能感兴趣的:(javascript)