Lodash groupBy()方法与原数组顺序一致



我正在使用groupBy lodash方法处理数组,这里是执行groupBy时,原数组顺序不存在,为任意groupBy()

const groupBy from "groupBy/lodash";
const mockData = [
{ groupId:"44", groupName:"mno",   },
{ groupId:"45", groupName:"pqr"  },
{ groupId:"40", groupName:"abc"  },
{ groupId:"41", groupName:"def"  },
]
const filteredArray = mockData.filter(item =>....); //logic to filter based on few parameters
const newArray = groupBy(filteredArray, "groupId");
console.log(newArray);
result - {
40: [{ groupId:"40", groupName:"abc"  }],
41: [{ groupId:"41", groupName:"def"  }],
44: [{ groupId:"44", groupName:"mno"  }],
45: [{ groupId:"45", groupName:"pqr"  }],
}
expected - {
44: [{ groupId:"44", groupName:"mno",   }],
45: [{ groupId:"45", groupName:"pqr"  }],
40: [{ groupId:"40", groupName:"abc"  }],
41 [{ groupId:"41", groupName:"def"  }],
}

我猜,groupBy方法是排序/分组groupId.

你能澄清这个问题,你是说mockData顺序是diff和newArray顺序是diff.如果是这样,那么它是groupedBy groupId,否则它会改变数组。

_.groupBy()函数创建一个对象。您正在按id分组,并且id是字符串形式的整数。ES6遍历顺序规则按整数属性的值(升序)排序——参见本文。在您的示例中,组是按id整数值排序的。

由于_.groupBy()实际上没有对键进行排序,也不能显式地对对象的整数键进行排序,因此您需要使用另一种保持顺序的结构- Map。

const groupByToMap = (arr, predicate) =>
arr.reduce((acc, o) => {
const key = predicate(o)

if(!acc.has(key)) acc.set(key, [])

acc.get(key).push(o)

return acc
}, new Map())
const mockData = [{ groupId:"44", groupName:"mno" }, { groupId:"45", groupName:"pqr"  },  { groupId:"40", groupName:"abc"  }, { groupId:"41", groupName:"def"  }]
const result = groupByToMap(mockData, o => o.groupId)
// !!! look at the browser's console (the snippet's would display an empty object) !!!
console.log(result) 
// when converting to an object the keys would be reordered by their integer value
console.log(Object.fromEntries(result))

最新更新