过滤与另一个数组的任何成员都不匹配的对象数组

时间:2013-10-15 15:02:44

标签: javascript arrays dojo

我有以下数据。我希望能够有效地过滤掉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”}]

提前致谢。

4 个答案:

答案 0 :(得分:2)

尝试使用Array.filterArray.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