【问题标题】:Split an array into small arrays based on text in values根据值中的文本将数组拆分为小数组
【发布时间】:2019-02-12 09:44:11
【问题描述】:

我有一个大数组,看起来像这个例子:

let array = ['aa-we', 'aa-we__qq', 'aa-we__qw', 'gsPlsOdd', 'bc-po-lp', 'bc-po-lp--ps', 'de', 'de__io', 'de__sl', 'de--xz', 'ccsDdd'];

我想将此数组按值拆分为小数组:

let array = [
  ['aa-we', 'aa-we__qq', 'aa-we__qw'],
  ['bc-po-lp', 'bc-po-lp--ps'],
  ['de', 'de__io', 'de__sl', 'de--xz']  
]

// and camelcase strings should be removed 

数组中的值具有类似 BEM 选择器的语法,因此如果不同字符串的前缀相同,则应将它们包装在单个数组中。

如果可能,我如何在没有其他库的情况下做到这一点?

感谢您的帮助或提示!

【问题讨论】:

  • 它也可以是一个对象吗?
  • 嗨!请使用tour(您将获得徽章!)并通读help center,尤其是How do I ask a good question? 您最好的选择是进行研究,search 以获取有关 SO 的相关主题,然后试一试. 如果您在进行更多研究和搜索后遇到困难并且无法摆脱困境,请发布您的尝试minimal reproducible example,并具体说明您遇到困难的地方。人们会很乐意提供帮助。
  • @yunzen 没有,只​​有数组。
  • @MarkMeyer 我猜是因为gsPlsOdd 是驼峰式。 OP在代码注释中写了“应该删除驼峰字符串”
  • @MarkMeyer 因为我不需要用 camelCase 编写的字符串。

标签: javascript arrays sorting ecmascript-6


【解决方案1】:

console.clear()
let data = [
  "aa-we",
  "aa-we__qq",
  "aa-we__qw",
  "gsPlsOdd",
  "bc-po-lp",
  "bc-po-lp--ps",
  "de",
  "de__io",
  "de__sl",
  "de--xz",
  "ccsDdd",
];


resultO = data.reduce((acc, val, idx) => {
  if (val.match(/[A-Z]/)) {return acc;}
  const sel = val.replace(/^(.*)(__|--).*$/g, "$1");
  acc[sel] = acc[sel] || [];
  acc[sel].push(val)
  return acc;
}, {})
resultA = Object.values(resultO)

console.log(resultA)

【讨论】:

  • 我也喜欢 James Coyle 的answer。它有一个更通用的方法
【解决方案2】:

我会做这样的事情,然后过滤掉你不想要的东西。

let array = ['aa-we', 'aa-we__qq', 'aa-we__qw', 'gsPlsOdd', 'bc-po-lp', 'bc-po-lp--ps', 'de', 'de__io', 'de__sl', 'de--xz', 'ccsDdd'];

array = array.filter((a) => !a.match(/[A-Z]/))

let result = groupBy(array, (str)=> str.split(/[-_]/)[0])

console.log(Object.values(result))

function groupBy(arr, condition) {
  return arr.reduce((result, current) => {
    const key = condition(current);
    (result[key] || (result[key] = [])).push(current)
    return result
  }, {})
}

【讨论】:

  • 查看有问题的 cmets。没有像gsPlsOdd 这样的骆驼案。
  • 因此“然后过滤掉你不想要的东西”。
  • 没看到。在浏览列表时进行过滤不是一个更好的主意,这样您就不必将所有内容都查看两次。
  • 已更新以做到这一点。
  • 您甚至可以修改传递给groupBy 的函数,以将任何无效的内容分组到一个键中,然后delete 该键或者可以修改 groupBy 函数以更专业地完成任务。我刚刚从我的辅助方法中获取了它。
【解决方案3】:

算法可以如下:

  1. 创建Map<Prefix,ValuesArray>
  2. 对于数组中的每个元素:
    • 获取它的前缀,例如"ab",如果无效则跳过元素(例如不存在前缀或驼峰式)
    • 添加到对应的哈希桶中
  3. Map 中的值合并到一个数组中

JS 具有实现这一点的所有原语,只需查看 Map/Object 进行哈希处理和 Array (map/filter/reduce) 进行处理。

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 2011-06-15
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多