У меня есть 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);
0
Bolek Lolek 31 Дек 2017 в 15:24

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);
2
Nina Scholz 31 Дек 2017 в 12:56

Попробуйте и это, вы легко можете изменить логику.

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);
0
Lefi Tarik 31 Дек 2017 в 13:43