У меня есть большой массив, который выглядит как этот пример:
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
Значения в массиве имеют синтаксис, подобный селекторам БЭМ, поэтому, если префикс разных строк одинаков, они должны быть заключены в один массив.
Как мне это сделать, если возможно, без дополнительных библиотек?
Спасибо за помощь или советы!
Привет! Пожалуйста, возьмите тур (вы получите значок!) и прочитайте центр помощи, в частности Как задать хороший вопрос?. Лучше всего провести исследование, поиск для связанных тем на SO, и попробовать. Если вы застряли и не можете выбраться после дополнительных исследований и поиска, опубликуйте минимальный воспроизводимый пример свою попытку и конкретно укажите, где вы застряли. Люди будут рады помочь.
@yunzen нет, только массив.
Почему в выводе нет gsPlsOdd, а есть de?
@MarkMeyer Я думаю, потому что gsPlsOdd - верблюжий. OP написал в комментарии к коду «и строки в верблюжьем регистре должны быть удалены»
@MarkMeyer, потому что мне не нужны строки, написанные в camelCase.
Считаются ли элементы строчными()?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Алгоритм может быть следующим:
Map<Prefix,ValuesArray>Map в один массивВ JS есть все примитивы для реализации этого, просто взгляните на Map/Object для хеширования и Array (map/filter/reduce) для обработки.
Я бы сделал что-то подобное, а затем отфильтровал бы то, что вам не нужно.
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.info(Object.values(result))
function groupBy(arr, condition) {
return arr.reduce((result, current) => {
const key = condition(current);
(result[key] || (result[key] = [])).push(current)
return result
}, {})
}Смотрите комментарии под вопросом. Нет верблюжьего корпуса, как у gsPlsOdd.
Отсюда и «а затем отфильтровать то, что вам не нужно».
Не видел этого. Не лучше ли фильтровать по списку, чтобы не смотреть на все дважды.
Обновлено, чтобы сделать это.
Вы даже можете изменить функцию, переданную groupBy, чтобы сгруппировать что-либо недопустимое в один ключ, а затем delete этот ключ или изменить функцию groupBy, чтобы она была более специализированной для этой задачи. Я просто взял его из своих вспомогательных методов.
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.info(resultA)Мне также нравится отвечать Джеймса Койла. Он имеет более общий подход
может это тоже объект?