【问题标题】:Index data on array property数组属性的索引数据
【发布时间】: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


【解决方案1】:

而不是使用 .join() 可能会造成可能的误报(正如您所解释的那样),

使用JSON.stringify()将整个字符串化数组存储为您的“ID”属性:

const data = {
  suze: ['apples'],
  pete: ['apples', 'oranges'],
  mary: ['oranges', 'apples'],
  james: ['pears'],
  ruth: ['pears']
};

const indexedData = Object.entries(data).reduce((ob, [name, fruits]) => {
  const id = JSON.stringify(fruits.sort());
  if (!ob[id]) ob[id] = { fruits, persons: [] };
  ob[id].persons.push(name);
  return ob;
}, {});

console.log(indexedData);

如果需要,您甚至可以使用 JSON.parse( objKey ) 取回数组

【讨论】:

  • 谢谢!如果用户选择一些卖家,您描述的方式是正确的解决方案,但这与 UI 无关,我需要预先进行分组。每个卖家只属于一个群体。就我而言,将有数百种水果和数百名卖家。我不能一口气看完所有不同的水果排列。此外,玛丽卖橙子的事实本身并不重要。就我而言,唯一相关的问题是 - 你能告诉我所有销售与玛丽完全相同的水果的卖家群体吗?
  • 这意味着键“apples_oranges”本身与我无关,例如,它可能是从数组派生的哈希值。但重要的是只将那些正好卖掉这些水果的人放在一个桶里。
  • 你的意思是作为输出?那也很好。对我来说,这是关于在创建此数组/对象期间如何区分 ['apples', 'oranges'] 和 ['apples_oranges']
  • 谢谢@Roko。我认为这也可以。我也会尝试一些不同的事情,所以不要将您的答案标记为已解决,但将来可能会这样做,非常感谢您的思考!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 2017-01-16
  • 2022-01-12
  • 1970-01-01
  • 2020-05-30
相关资源
最近更新 更多