Фильтр JavaScript и сокращение массива для объединения строк - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь использовать концепцию filter и map вместо перебора массива с использованием цикла {for}.

Вот мой старый код.Я передаю массив для фильтрации и объединения соответствующих строк.

function oldFunction(data) {
    let dataDeleted = '';
    let each
    for (each of data) {
        if (each.includes('_DELETE')) {
            dataDeleted = dataDeleted + each.substring(0, each.length - 7) + '###';
        }
    }
    dataDeleted = dataDeleted;
    console.log(dataDeleted);
}

oldFunction(['meow_DELETE', 'haga', 'Neigh_DELETE']);

Вывод: 'meow###Neigh###'

Теперь, когда я пытаюсь использовать метод 'filter' и 'Reduce', он нене похоже на работу:

function newMethod(data) {

    const dataDeleted = data
        .filter(d => d.includes('_DELETE'))
        .reduce((deletedData, d) => {
            deletedData.concat(`${d}### `);
        }, '');

    console.log(dataDeleted);
    return dataDeleted;

}

Это возвращает 'undefined'.Есть указатели?Заранее спасибо.

Ответы [ 3 ]

9 голосов
/ 05 июня 2019

Я полагаю, вам просто нужно return данные в вашей функции редуктора.

.reduce((deletedData, d) => {
   return deletedData.concat(`${d}### `);
}, '')

или в сокращенной версии:

.reduce((deletedData, d) => deletedData.concat(`${d}### `), '')
1 голос
/ 05 июня 2019
function newMethod(data) {

    const dataDeleted = data
        .filter(d => d.includes('_DELETE'))
        .reduce((acc, d) => {
            return acc.concat(`${d}### `);
        }, '');

    return dataDeleted;

 }
1 голос
/ 05 июня 2019

Вот альтернативный подход, использующий join() и concat() вместо recude(), так как сокращение внутренне повторяет массив, если это то, чего вы хотите избежать по какой-либо причине. Нужно проверить производительность обоих подходов, чтобы увидеть, какой из них предпочтительнее.

Обновление: Я на самом деле сделал именно это на JSperf , и мой подход примерно на 60-70% медленнее , чем у Quantastical, поэтому вам определенно следует придерживаться этого .

Update2: Я обновил код, чтобы соответствовать новым требованиям из комментария, теперь использую только filter() и reduce().

function newMethod(data) {

    const dataDeleted = data
        .filter(d => d.includes('_DELETE'))
        .reduce((deletedData, d) => {
          return deletedData.concat(`${deletedData.length ? '###' : ''}${d.replace(/_DELETE$/, '')}`);
        }, '');

    console.log(dataDeleted);
    return dataDeleted;

}
newMethod(['meow_DELETE', 'haga', 'Neigh_DELETE']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...