2016-04-01 4 views
0

複数の列を検索したいと考えていますが、複数の列を検索する1つの検索語句でインターネット上のすべてのコードを制限しています。検索用語と複数のプロパティ名を使用したフィルタリングについてのLodashヘルプ

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'; 

は、第二のオブジェクトを除外配列を生じるはずである:私は、複数の検索条件で複数の列に

データをフィルタリングしたいです。 ありがとう!

答えて

0

最も効率的ではありませんが、仕事をしています。あなたは、プロパティ値の非大文字と小文字を区別する比較を行うことが必要になる場合があります

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/

編集:ちょうどLodashタグに気づきました。これを使用する場合、フレームワークで配列プロトタイプと同じ関数名を使用しています。すなわち、_.filter_.some

0

私は2つの解決策を作成しました。最初のものは、あなたが必要とするものを正確に行います:2つのフィールドによるコレクションのフィルタリング。 2番目のフィルタは、複数のフィールドでフィルタリングできるため、柔軟性があります。

まず解決策:

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>

第二の溶液:

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>

0

ここでは非常に簡単lodash versiです上:

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

これは、選択されたプロパティ名の値のいずれかの場合に基づいてオブジェクトをフィルタする検索語トークンと交差します。

関連する問題