2016-04-01 17 views
0

Birden çok sütunta arama yapmak istiyorum ancak internette bulabildiğim tüm kodlar, birden fazla sütunda arama yapabilecek tek bir arama terimi ile kısıtlandı. Birden çok arama terimleriLodash, bir arama terimi ve birden çok özellik adı kullanarak filtreleme ile ilgili yardım

tarafından birden çok sütun üzerinde filtre isteyen

veriler:

var propertynames = ['firstName','lastName']; 
var data = [ 
    { 
    "city":"Irwin town", 
    "address":"1399 Cecil Drive", 
    "lastName":"Auer", 
    "firstName":"Wanda" 
    }, 
    { 
    "city":"Howell haven" 
    "address":"168 Arnoldo Light" 
    "lastName":"Balistreri", 
    "firstName":"Renee" 
    } 
]; 
var searchTerm = 'Wanda Auer'; 

2 nesneyi filtrelenen bir dizi neden olmalı. Teşekkürler!

cevap

0

En verimli değil ama işi yapar. Sen özellik değerlerine üzerinde olmayan harf duyarlı karşılaştırma yapmak isteyebilirsiniz:

var searchTerm = 'Wanda Auer', 
    splitted = searchTerm.split(' '); 

var result = data.filter(function(item){ 
    return window.Object.keys(item).some(function(prop){ 
     if(propertynames.indexOf(prop) === -1) 
      return; 
     return splitted.some(function(term){ 
      return item[prop] === term; 
     }); 
    }); 
}); 

https://jsfiddle.net/3g626fb8/1/

Edit: Sadece Lodash etiketini fark ettim. Bunu kullanmak isterseniz, çerçeve dizi prototipiyle aynı işlev adlarını, yani _.filter ve _.some

0

Sorunuz için iki çözüm oluşturdum. İlki tam olarak ihtiyacınız olanı yapmak: iki alandan filtre koleksiyonu. İkincisi daha esnektir, çünkü herhangi bir çoklu alanla filtreye izin verir.

İlk çözüm:

function filterByTwoFields(coll, searchFilter) { 
 
    return _.filter(coll, function(item) { 
 
    return (item.firstName + ' ' + item.lastName) === searchTerm; 
 
    }); 
 
} 
 

 
var data = [ 
 
    { 
 
    "city":"Irwin town", 
 
    "address":"1399 Cecil Drive", 
 
    "lastName":"Auer", 
 
    "firstName":"Wanda" 
 
    }, 
 
    { 
 
    "city":"Howell haven", 
 
    "address":"168 Arnoldo Light", 
 
    "lastName":"Balistreri", 
 
    "firstName":"Renee" 
 
    } 
 
]; 
 
var searchTerm = 'Wanda Auer'; 
 

 
var result = filterByTwoFields(data, searchTerm); 
 
alert(JSON.stringify(result));
<script src="https://raw.githubusercontent.com/lodash/lodash/master/dist/lodash.min.js"></script>

İkinci çözüm:

function filterByMultipleFields(coll, filter) { 
 
    var filterKeys = _.keys(filter); 
 
    return _.filter(coll, function(item) { 
 
    return _.every(filterKeys, function(key) { 
 
     return item[key] === filter[key]; 
 
    }); 
 
    }); 
 
} 
 

 
var data = [ 
 
    { 
 
    "city":"Irwin town", 
 
    "address":"1399 Cecil Drive", 
 
    "lastName":"Auer", 
 
    "firstName":"Wanda" 
 
    }, 
 
    { 
 
    "city":"Howell haven", 
 
    "address":"168 Arnoldo Light", 
 
    "lastName":"Balistreri", 
 
    "firstName":"Renee" 
 
    } 
 
]; 
 

 
var filter = { 
 
    firstName: 'Wanda', 
 
    lastName: 'Auer' 
 
} 
 
var result = filterByMultipleFields(data, filter); 
 
alert(JSON.stringify(result));
<script src="https://raw.githubusercontent.com/lodash/lodash/master/dist/lodash.min.js"></script>
İşte

0

oldukça basit bir lodash versi olduğunu tarih:

var matchingRecords = _.filter(data, function (object) { 
    return _(object) 
     .pick(propertynames) 
     .values() 
     .intersection(searchTerm.split(' ')) 
     .size() > 0; 
}) 

O seçilmiş özellik adı değerlerin herhangi bir arama terimi belirteçleri ile kesişir eğer dayanan nesneler filtreler.

İlgili konular