Поисковая служба в array объектов

var data = [
    {
      _id: '001',
      name: 'Elon Musk',
      rol: 'Chairman',
      image: 'https://picsum.photos/200/101',
      email: 'elon.musk@foo.com',
      phone: '5544332211',
      active: true,
      exp: 30
    },
    {
      _id: '002',
      name: 'Carlos Hernandez',
      rol: 'Chief Operation Officer',
      image: 'https://picsum.photos/200/102',
      email: 'carlos.hernandez@foo.com',
      phone: '5544332211',
      active: true,
      exp: 15
    },
    {
      _id: '003',
      name: 'Alberto Siurob',
      rol: 'Chief Information Officer',
      image: 'https://picsum.photos/200/103',
      email: 'alberto.siurob@foo.com',
      phone: '5544332211',
      active: false,
      exp: 5
    },
    {
      _id: '004',
      name: 'Erick Lopez',
      rol: 'Chief Marketing Officer',
      image: 'https://picsum.photos/200/104',
      email: 'erick.lopez@foo.com',
      phone: '5544332211',
      active: true,
      exp: 1
    },
  ];
  

function search( value ){
 // Si no esta vacio
 if( value ) {
  
  const keys = ['name', 'email', 'rol'];
  const match = searchKeys( data, keys, value.toLowerCase() );
  console.log( match );
 }
}

function searchKeys( source, keys, word ){
   const arr = [];
   
   // Recorrer llaves de busqueda
  keys.forEach( ( k ) => {
  
    // Recorrer la fuente
    source.forEach( ( s ) => {
    
      // validar si el indice tiene un valor semejante
      if ( s[ k ].toLowerCase().includes( word ) ) {
      
        // validar si ya existe en el arreglo
        if ( arr.indexOf( s._id ) < 0 ) {
          arr.push( s );
        }
      }
    });
  });
  return arr;
}
<input type="text" onkeyup="search( this.value )">

Я делаю маленькая поисковая служба с прибылью Javascript. Правда состоит в том, что оно функционирует очень хорошо, но у меня есть, что проблема, которая, если я только помещаю букву в неудар в лунку, утраивает возвращенные результаты.

Что я буду вредить?

PD: Если у них есть какая-то подсказка делания этого лучшей формой, всегда она втречена с радостью

3
задан 31.10.2019, 21:06
1 ответ

Pudes использовать .filter, .some и .test, чтобы уменьшать cГіdigo. Идея serГ, - чтобы выдавать все элементы, в которых какое-то из свойств ('ямс', 'электронная почта', 'список') совпадает с нею bГєsqueda.

var data = [{"_id":"001","name":"Elon Musk","rol":"Chairman","image":"https://picsum.photos/200/101","email":"elon.musk@foo.com","phone":"5544332211","active":true,"exp":30},{"_id":"002","name":"Carlos Hernandez","rol":"Chief Operation Officer","image":"https://picsum.photos/200/102","email":"carlos.hernandez@foo.com","phone":"5544332211","active":true,"exp":15},{"_id":"003","name":"Alberto Siurob","rol":"Chief Information Officer","image":"https://picsum.photos/200/103","email":"alberto.siurob@foo.com","phone":"5544332211","active":false,"exp":5},{"_id":"004","name":"Erick Lopez","rol":"Chief Marketing Officer","image":"https://picsum.photos/200/104","email":"erick.lopez@foo.com","phone":"5544332211","active":true,"exp":1}];

function search(value) {

    if (value) {

        const keys = ['name', 'email', 'rol'];

        return data.filter(e => keys.some(a => (new RegExp(value,"gi")).test(e[a])));

    }

}

console.log(search("lop"));
1
ответ дан 01.12.2019, 14:43
  • 1
    Те quedó животный ответ sensei, спасибо. – Alberto Siurob 01.11.2019, 17:13