Javascript - Оптимизированный способ извлечения подмножества элементов из массива на основе указанных c критериев - PullRequest
0 голосов
/ 25 февраля 2020

Учитывая массив меток, я хочу извлечь те значения, которые начинаются с ключевых слов, указанных в другом массиве.

Ввод: Два массива - labels, keys.

Требуемый вывод:

Все значения из массива labels, начинающиеся с любого из значений из keys array

Что Я уже пробовал:

    const keys= ['activity', 'admin'];
    const labels = ["accountTypes.GROUP_ACCOUNT",
    "accountTypes.SINGLE_ACCOUNT",
    "activity.active",
    "activity.inactive",
    "admin.dictionaries.name",
    "admin.group.details.addedDate",
    "admin.group.details.enterDescription"];

    let arr = [];
    keys.forEach( key => {
      labels.forEach(label => {
        if (label.indexOf(key) === 0){
          arr.push(label);
        }
      });
    });

    console.log(arr)

Требуется помощь:

Я хочу реорганизовать этот код без indexOf() и удалить бесполезную groupArr. Я хочу использовать ^ ES6 или / и Лода sh

Ответы [ 3 ]

0 голосов
/ 28 февраля 2020

Подмножество массива можно извлечь с помощью метода filter .

Метод filter принимает функцию, которая возвращает логическое значение в качестве входного. Для сравнения логическая функция может содержать лог c.

Вот рабочее решение для извлечения значений из массива меток, которые начинаются с текста из массива ключей:

// File name: array-subset.js

const keys= ['activity', 'admin']

const labels = ["accountTypes.GROUP_ACCOUNT",
    "accountTypes.SINGLE_ACCOUNT",
    "activity.active",
    "activity.inactive",
    "admin.dictionaries.name",
    "admin.group.details.addedDate",
    "admin.group.details.enterDescription"]


// Function to be used as the input for 'filter' method

function matchedValue(label) {
        return keys.includes(label.split(".")[0])
}


console.log(labels.filter(matchedValue))

Вывод:

$ node array-subset.js 
[ 'activity.active',
  'activity.inactive',
  'admin.dictionaries.name',
  'admin.group.details.addedDate',
  'admin.group.details.enterDescription' ]
0 голосов
/ 29 февраля 2020

Вы можете использовать разницу, разницу с и включает в себя sh

const keys= ['activity', 'admin'];
    const labels = ["accountTypes.GROUP_ACCOUNT",
    "accountTypes.SINGLE_ACCOUNT",
    "activity.active",
    "activity.inactive",
    "admin.dictionaries.name",
    "admin.group.details.addedDate",
    "admin.group.details.enterDescription"];

   _.difference(labels,_.differenceWith(labels, keys,(label,key) => _.includes(label,key)));
0 голосов
/ 25 февраля 2020

Вы можете использовать функцию filter вместе с функцией includes для фильтрации нужных элементов / строк.

const keys = ['activity', 'admin'];
const labels = ["accountTypes.GROUP_ACCOUNT","accountTypes.SINGLE_ACCOUNT","activity.active","activity.inactive","admin.dictionaries.name","admin.group.details.addedDate","admin.group.details.enterDescription"];

let arr = labels.filter(l => {
  let [label] = l.split(".");
  return keys.includes(label);
});
console.log(arr)
...