Как использовать элементы фильтра reduce tp в массиве?

#javascript

#javascript

Вопрос:

У меня есть этот массив, и я использую функцию filter и forEach (она работает просто отлично), но я хотел бы сделать это с помощью функции reduce javascript. Заранее большое спасибо?

Вот решение с использованием filter и forEach

  arr
   .filter(el => typeof el.value === 'string' amp;amp; el.value.includes('test'))
       .forEach(el => {
           if (el.key === 'cars') {
             el.value = el.value.replace('test', 'TICO');
           }
         }
   );
  

Комментарии:

1. Что вы пытаетесь сделать? Каков ваш ожидаемый результат?

2. @Yousaf Я пытаюсь сделать то же самое, но с функцией ‘reduce’ javascript

3. Действительно, я не думаю, что вы хотите уменьшить массив, и forEach он ничего не сделает, я думаю, вы хотите map после filtering массива

4. Почему вы хотите использовать .reduce() метод, когда метод .filter() and .map() более подходит для выполнения того, что вы делаете

5. but I would like to do it using reduce javascript function но почему? reduce это неправильный инструмент для того, что вы делаете, так почему вы настаиваете на его использовании? Почему reduce , а не some для примера?

Ответ №1:

Может быть, это:

 arr.reduce((all, el) => {
  if ((el) => typeof el.value === 'string' amp;amp; el.value.includes('test'))
    all.push({
      ...el,
      value: el.key === 'cars' ? el.value.replace('test', 'TICO') : el.value,
    });

  return all;
}, []);
  

Комментарии:

1. В push части это должно быть ...all вместо ...el . В любом случае, я думаю, что он / она не хочет использовать reduce вместо просто a filter и a map

2. @AgustinMoles это должно быть ...el , а не ...all потому all , что весь массив

3. @AgustinMoles на самом деле должно быть ...el , потому что мы хотим нажать элемент с измененным значением, если ключ cars

4. @losif Спасибо за твой вклад, брат!

5. @progx Нет проблем 💪

Ответ №2:

Но вам не нужно filter() . В настоящее время вы (ab) используете фильтр просто как еще одно условие для вашего forEach . Вы могли бы также просто переместить тело вашей функции фильтра внутри условия в вашем forEach

 arr.forEach(el => {
  if (typeof el.value === 'string' amp;amp; el.value.includes('test') amp;amp; el.key === 'cars') {
    el.value = el.value.replace('test', 'TICO');
  }
});
  

вы могли бы даже продолжить и сделать

 arr.forEach(el => {
  if (typeof el.value === 'string' amp;amp; el.key === 'cars') {
    el.value = el.value.replace('test', 'TICO');
  }
});
  

Я даже не думаю, что это менее эффективно, так как replace в любом случае нужно «найти» строку test .

Комментарии:

1. Большое спасибо за твою помощь, брат!

Ответ №3:

Это будет использовать ту же функцию Array.reduce .

 const result = arr.reduce((acc, el) => {
  if (typeof el.value === 'string' amp;amp; el.value.includes('test')) {
    acc.push({
      ...el,
      value: el.key === 'cars' ? el.value.replace('test', 'TICO') : el.value
    });
  }
  return acc;
}, []);
console.log(result);  

Комментарии:

1. Спасибо за твой вклад, брат!