@max_bu

Как правильно обработать данные массива? метод .filter()?

Здравствуйте, подскажите пожалуйста:

Задача:
1.Есть ассоциативный массив с такими объектами: (речь идет о сотнях таких объектов внутри)
arr: [ { name: ' SB ', id: 'O5', value: 10,}, { name: ' SB ', id 'O5', value: 11,} ]

2. Я во 2Vue.js принимаю значение с селекта:
options: [{
            value: 'O1',
            label: 'Первый'
            },{
            value: 'O7',
            label: 'Второй'
            }]

3. Необходимо каждый объект массива проверить на соответствие выбранному значению селекта.
4. Те объекты что попадают под это условие вывести в новый массив
5. Найти объект в новом массиве с минимальным value

Я тапорно сделал так:
RSUM: function (){
          var response = this.arr;
          var va = this.value;
          var defaul = this.defaultPrograms;
          var rates = response.filter(function(elem) {
            return elem.id == va;
            });
            if (rates.length == 0) {
                rates = defaul;
                console.log(rates);
                };
                console.log(rates.length);
                var minEl = rates[0].value
                var br = rates.filter(function(elem){
              return elem.value <= minEl;
          });
            
          console.log(br);
          this.ValueMin = br[0].value;
        console.log(this.ValueMin);
      }

Но работает через раз, и чую я что работает по случайности.

ВОПРОС РАЗ: Как правильно и лучше реализовать данный функционал? (при условии что данных будет более 100)

ВОПРОС ДВА: Если минимальные значения у нескольких элементов, как добавить второй параметр для ранжирования?

ВОПРОС ТРИ: Как делать такую же фильтрацию по нескольким параметрам? Например добавлять в новый массив когда совпадает: id/(checkbox1)/(checkbox) и тд...

Заранее спасибо!
  • Вопрос задан
  • 382 просмотра
Пригласить эксперта
Ответы на вопрос 1
Machinez
@Machinez
почему ты решил что первый элемент будет минимальным?
var minEl = rates[0].value;
тут скорей нужен метод sort нежели filter
var br = rates.filter(function(elem){
     return elem.value <= minEl;
});

аналогично первому вопросу, ты отфильтровал массив по значению первого элемента, это не значит что первый элемент нового массива будет минимальным.
this.ValueMin = br[0].value;
если данных будет более 100, то лучше фильтрацию и сортировку сделать за один проход по массиву
var rates = response.reduce(function (acc, elem) {
    if (elem.id === va) {
      if (!acc) {
        return elem.value;
      }
      
      return elem.value < acc ? elem.value : acc;
    }

    return acc;
}, 0);

подправил код
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы