2017-01-25 28 views
1

我要篩選具有許多照片這樣的信息的陣列,但過濾器應該是可變的(自變量和自變量的數據類型):可變過濾器標準

var photos = [ 
    { 
    lat: -15, 
    lng: -20, 
    alt: 381, 
    date: "2016-12-12", 
    comment: "Text1" // and many more arguments like file size, bitdepth, iso, ... 
    }, 
    { 
    lat: -17, 
    lng: -22, 
    alt: 1381, 
    date: "2016-11-11", 
    comment: "Text2" // and many more arguments like file size, bitdepth, iso, ... 
    }, 
    { 
    lat: -25, 
    lng: -30, 
    alt: 1000, 
    date: "2016-10-10", 
    comment: "Text3" // and many more arguments like file size, bitdepth, iso, ... 
    }, 
]; 

現在我D類似於使用該方法

array.filter(callbackfn[, thisArg]) 

但過濾標準和數據類型的數據尋找變化的陣列來篩選(例如搜索與元件「(LAT < -15)」或「(LNG> -25 )& &(alt> 1000)'或'comment ==「T ext2「,但我不知道如何做到這一點。顯然,這

function filterMetaData(obj, filterString) { 
    if(filterString) { 
     return true; 
    } else { 
     return false; 
    } 
} 

var result = photos.filter(filterMetaData, "lat < -18"); 

不起作用,因爲「LAT < -18」是一個字符串,而不是解釋像一個標準,所以如果(filterString)總是真。

這怎麼辦? Thx,Markus!

回答

1

你可以使用函數作爲參數

function filterMetaData(fn) { 
 
    return function (o) { 
 
     return fn(o); 
 
    }; 
 
} 
 

 
var photos = [{ lat: -15, lng: -20, alt: 381, date: "2016-12-12", comment: "Text1" }, { lat: -17, lng: -22, alt: 1381, date: "2016-11-11", comment: "Text2" }, { lat: -25, lng: -30, alt: 1000, date: "2016-10-10", comment: "Text3" }], 
 
    result = photos.filter(filterMetaData(function (o) { return o.lat < -18; })); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
解構與

ES6 object property assignment pattern

function filterMetaData(fn) { 
 
    return function (o) { 
 
     return fn(o); 
 
    }; 
 
} 
 

 
var photos = [{ lat: -15, lng: -20, alt: 381, date: "2016-12-12", comment: "Text1" }, { lat: -17, lng: -22, alt: 1381, date: "2016-11-11", comment: "Text2" }, { lat: -25, lng: -30, alt: 1000, date: "2016-10-10", comment: "Text3" }], 
 
    result = photos.filter(filterMetaData(({ lat, lng, alt, date }) => lat < -15 || (lng > -25 && alt > 1000))); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

THX,這就是我一直在尋找 – Markus

+0

設法使功能人性化:如何修改,只需要過濾條件即G。 '(lat <-15)|| (lng> -25 &&(alt> 1000)'而不是'(o.lat <-15)||(o.lng> -25 &&(o.alt> 1000)'@ – Markus

+0

@Markus,也許是第二種方法爲你工作與ES6。 –

0

像這樣

data = photos.filter(function(a){ 
return (a.lat < -15) ||(a.lng > -25 && (a.alt > 1000) || (a.comment == "Text2"); 
}); 
consoe.log(data)