【发布时间】:2020-07-06 10:34:27
【问题描述】:
我有一组数据,如下所示:
const data = {
suze: ['apples'],
pete: ['apples', 'oranges'],
mary: ['oranges', 'apples'],
james: ['pears'],
ruth: ['pears']
}
我需要根据他们出售的水果对他们进行分组。水果数组中的顺序无关紧要。我会这样做:
const indexedData = {}
Object.entries(data).forEach(([name, fruits]) => {
const id = fruits.sort().join('_')
if (!indexedData[id]) {
indexedData[id] = {
fruits,
persons: []
}
}
indexedData[id].persons.push(name)
})
我会得到这个:
console.log(indexedData)
// {
// apples: {
// fruits: ["apples"],
// persons: ["suze"]
// },
// apples_oranges: {
// fruits: ["apples", "oranges"],
// persons: ["pete", "mary"]
// },
// pears: {
// fruits: ["pears"],
// persons: ["james", "ruth"]
// }
// }
这很好用,但我想知道是否有更好的方法来创建索引 (const id = fruits.sort().join('_'))。
理论上,有人可以出售一种名为“apples_oranges”的新水果,但我们会遇到问题。我可以想办法防止这种情况发生,比如跟踪数组长度,或者将_ 分隔符替换为一些“永远不会”出现在水果名称中的字符串,但也许有更好的方法来解决这个问题?
或者我应该以完全不同的方式处理这个问题?
【问题讨论】:
-
我完全不明白你为什么要创建
"apples_oranges"。不要这样做。只需使用"apples"、"oranges"。假设您对每种水果类型都有复选框,如果同时选中“Apples”和“Oranges”,那么这是查询所有销售这两种水果的人的正确方法,或者取决于您的业务逻辑 - 两者之一。 -
我们在当前项目中遇到了一个相似的问题——不一样——但基本上我们只是选择了一个最相似的字符,它永远不会出现在传入的字符串中。如果这还不够,你可以再深入一点,尝试不使用一个字符,而是使用几个字符作为分隔符,这样出现的概率会更小。另外,这对我来说似乎有点奇怪——你是否考虑过不创建这些连接,而是将 pete 和 mary 都添加到苹果和橙子中?这样看起来更自然
标签: javascript arrays indexing data-structures frontend