У меня есть arr
с деревом категорий. Пример: категория yy
является подкатегорией ww
, а ww
является подкатегорией zz
. Я хочу отфильтровать этот массив и получить такой результат: ['aa_bb', 'aa_cc', 'zz_ww_yy']
. Так что я не хочу zz
и zz_ww
, потому что у меня это есть в zz_ww_yy
. Я думаю, что мне нужно использовать функцию фильтра и, может быть, какое-то регулярное выражение? хммм а может foreach? Что ты думаешь?
var arr = ['aa_bb', 'aa_cc', 'aa', 'zz', 'zz_ww','zz_ww_yy'];
var filtered = arr.filter(function(a){
//???
})
console.log(filtered);
2 ответа
Вы можете взять String#indexOf
и отфильтруйте временный массив результатов с заданной строкой.
Затем проверьте, не является ли строка подстрокой набора результатов, и нажмите ее, если нет.
var array = ['aa_bb', 'aa_cc', 'aa', 'zz', 'zz_ww','zz_ww_yy'],
result = array.reduce(function (r, a) {
r = r.filter(b => a.indexOf(b) === -1);
if (r.every(b => b.indexOf(a) === -1)) {
r.push(a);
}
return r;
}, []);
console.log(result);
Попробуйте и это, вы легко можете изменить логику.
var arr = ['aa_bb', 'aa_cc', 'aa', 'zz', 'zz_ww', 'zz_ww_yy'];
function shoulFilterCategory(arr, itemToTest, itemIndex) {
var shouldFilter = false;
arr.filter((item, index) => index !== itemIndex)
.forEach(item => {
if (item.startsWith(itemToTest) && itemToTest.length < item.length) {
shouldFilter = true;
}
});
return shouldFilter;
}
var filtered = arr.filter(
(item, index) => !shoulFilterCategory(arr, item, index)
);
console.log('filtered', filtered);
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.