根据值中的文本将数组拆分为小数组

时间:2019-02-12 09:44:11

标签: javascript arrays sorting ecmascript-6

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

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选择器的语法,因此,如果不同字符串的前缀相同,则应将它们包装在单个数组中。

如果没有附加库,我如何才能做到这一点?

感谢您的帮助或提示!

3 个答案:

答案 0 :(得分:3)

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

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
  }, {})
}

答案 1 :(得分:3)

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)

答案 2 :(得分:2)

算法可以如下:

  1. 创建Map<Prefix,ValuesArray>
  2. 对于数组中的每个元素:
    • 获取其前缀,例如“ ab”,如果无效(例如不存在前缀或驼峰大小写),则跳过元素
    • 添加到相应的哈希存储桶
  3. Map中的值加入一个数组

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