2017-01-25 29 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)