возвращаемое значение после фильтрации массива внутри объекта массивов - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь создать автозаполнение, которое возвращает массив объектов, используя функцию.Мой объект выглядит примерно так:

this.vehiclesList =
  [
    {
      "additionalDriverContacts": [9929929929, 9992992933, 9873773777],
      "id": 1
    },
    {
      "additionalDriverContacts": [8388388388, 8939939999],
      "id": 2
    }
  ]

Я хочу отфильтровать массив на основе AdditionalDriverContacts .

Моя функция выглядит следующим образом:

filterVehicleAdditionalMobile(val: string) {
     if (typeof val != 'string') {
            return [];
        }
    let value= val? this.vehiclesList.filter((item) => {
            if(item.additionalDriverContacts) 
                 item.additionalDriverContacts.forEach((option)=> {
                   String(option).toLowerCase().indexOf(val.toLowerCase()) != -1 
                })
             }
     }) : this.vehiclesList;
    console.log(value)
    return value;
}

Но в консоль входит значение пустого массива.Где я неправ.Я пытался найти решение в этом вопросе Как мне отфильтровать массив внутри массива объектов? , но это не помогло, поскольку мой сценарий использования отличается.

Мой желаемый результатдолжно иметь вид: Если в качестве аргумента функции передано значение 99299, то дополнительныеDriverContacts, соответствующие этому номеру, должны быть возвращены в виде массива.для ввода 99299 должен быть возвращен результат = [9929929929,9992992933]

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Итак, что вам нужно сделать, это сначала преобразовать каждый из элементов в vehiclesList в массив совпадающих результатов, а затем объединить их вместе.

Дайте этому попытку:

var vehiclesList = [{
    "additionalDriverContacts": [9929929929, 9992992933, 9873773777],
    "id": 1
  },
  {
    "additionalDriverContacts": [8388388388, 8939939999],
    "id": 2
  }
];

function filterVehicleAdditionalMobile(val) {
  if (typeof val != 'string') {
    return [];
  }
  // array of arrays
  const values = vehiclesList.map((item) => {
      if (!item.additionalDriverContacts) { return []; }
      
      return item.additionalDriverContacts.filter((option) => 
          String(option).toLowerCase().indexOf(val.toLowerCase()) != -1
      );
  });
  
  console.log(values);

  // flatten
  return Array.prototype.concat.apply([], values);
}

console.log(filterVehicleAdditionalMobile('99'));

Кроме того, вы можете объединить все элементы вместе, а затем отфильтровать их.Это менее эффективный, но более простой и менее кодовый код:

var vehiclesList = [{
    "additionalDriverContacts": [9929929929, 9992992933, 9873773777],
    "id": 1
  },
  {
    "additionalDriverContacts": [8388388388, 8939939999],
    "id": 2
  }
];

function flatten(values) {
    return Array.prototype.concat.apply([], values);
}

function filterVehicleAdditionalMobile(val) {
  if (typeof val != 'string') {
    return [];
  }
  
  return flatten(vehiclesList.map(v => v.additionalDriverContacts || []))
      .filter(option => String(option).toLowerCase().indexOf(val.toLowerCase()) != -1);
}

console.log(filterVehicleAdditionalMobile('99'));
0 голосов
/ 10 октября 2018

для ввода 99299, должен быть возвращен результат = [9929929929,9992992933]

Мы можем использовать массив .map() для извлечения контактов, затем отфильтровать строку .search():

const vehiclesList = [
    {"id": 1, "additionalDriverContacts": [9929929929, 9992992933, 9873773777]},
    {"id": 2, "additionalDriverContacts": [8388388388, 8939939999]}]

result = getMatchingContacts(vehiclesList, 99299) // run test
console.log(result)                               // show result

function getMatchingContacts(list, key) {  
  const arrayOfContacts = list.map(item => item.additionalDriverContacts)
  const contacts = [].concat(...arrayOfContacts)                       // flatten the nested array
    .filter(contact => contact.toString().search(key.toString()) >= 0) // find matches
  return contacts
}

Надеюсь, это поможет.

Приветствия,

0 голосов
/ 21 сентября 2018

Обновлено: при последнем редактировании вопроса

попробуйте изменить на:

  filterVehicleAdditionalMobile(val: string) {
    if (typeof val !== 'string') {
      return [];
    }

    let driverContacts = [];
    this.vehiclesList.forEach((vehicule) => {
      if (vehicule.additionalDriverContacts) {
        if (val) {
          driverContacts = driverContacts.concat(vehicule.additionalDriverContacts.filter((driverContact) => {
            return String(driverContact).toLowerCase().indexOf(val.toLowerCase()) !== -1;
          }));
        } else {
          driverContacts = driverContacts.concat(vehicule.additionalDriverContacts);
        }
      }
    });

    return driverContacts;
  }

Тест:

const driver = this.filterVehicleAdditionalMobile('8');
console.log(driver);

Дисплей:

0: 9873773777 1: 8388388388 2: 8939939999

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...