我有以下数据。我希望能够有效地过滤掉sites
数组中segmentCode
数组中没有匹配segmentCodes
的所有对象。我可以使用dojo或本机javascript,但我无法访问任何其他库。
var segmentCodes = ["10", "20","30","40"];
var sites = [
{"siteid":1, "segmentCode":"10"},
{"siteid":2, "segmentCode":"10"},
{"siteid":3, "segmentCode":"20"},
{"siteid":4, "segmentCode":"30"},
{"siteid":5, "segmentCode":"70"},
{"siteid":6, "segmentCode":"999"}];
结果应如下所示:
[{“siteid”:5,“segmentCode”:“70”},{“siteid”:6,“segmentCode”:“999”}]
提前致谢。
答案 0 :(得分:2)
尝试使用Array.filter和Array.indexOf
var res = sites.filter(function( o){
return segmentCodes.indexOf(o.segmentCode) == -1;
});
<强> Demo 强>
答案 1 :(得分:1)
有效的解决方案是将segmentCodes
转换为地图:
map = segmentCodes.reduce(function(o, x) { return o[x] = 1, o }, {})
然后使用O(1)查找来过滤代码:
result = sites.filter(function(x) { return !(x.segmentCode in map) })
如果您希望更快,请使用普通循环替换迭代器函数。
答案 2 :(得分:1)
嗯,使用Dojo的正确解决方案是使用dojo/_base/array
模块。例如:
require(["dojo/_base/array"], function(arrayUtils) {
arrayUtils.filter(sites, function(site) {
return arrayUtils.indexOf(segmentCodes, site.segmentCode) < 0;
});
});
我也做了一个例子JSFiddle。
答案 3 :(得分:0)
CLJ! 看看这个!
var segmentCodes = ["10", "20","30","40"];
var sites = [
{"siteid":1, "segmentCode":"10"},
{"siteid":2, "segmentCode":"10"},
{"siteid":3, "segmentCode":"20"},
{"siteid":4, "segmentCode":"30"},
{"siteid":5, "segmentCode":"70"},
{"siteid":6, "segmentCode":"999"}];
var segmentCodes = ["10", "20","30","40"];
Array.prototype.filter = function(fun, notMatchArray) {
'use strict';
if (!this) {
throw new TypeError();
}
var objects = Object(this);
var len = objects.length >>> 0;
if (typeof fun !== 'function') {
throw new TypeError();
}
var res = [];
var thisp = arguments[1];
for (var i in objects) {
if (objects.hasOwnProperty(i)) {
if(notMatchArray.indexOf(objects[i].segmentCode) === -1)
res.push(objects[i]);
}
}
fun.call(thisp, res);
};
sites.filter(function(result){
console.log('result', result);
}, segmentCodes);
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter