2

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

4 回答 4

2

尝试使用Array.filterArray.indexOf

var res = sites.filter(function( o){
  return segmentCodes.indexOf(o.segmentCode) == -1;
});

演示

于 2013-10-15T15:05:10.837 回答
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) })

如果您希望它更快,请将迭代器函数替换为普通循环。

于 2013-10-15T15:06:29.837 回答
1

好吧,Dojo 的正确解决方案是使用该dojo/_base/array模块。例如:

require(["dojo/_base/array"], function(arrayUtils) {
    arrayUtils.filter(sites, function(site) {
        return arrayUtils.indexOf(segmentCodes, site.segmentCode) < 0;
    });
});

我还做了一个例子JSFiddle

于 2013-10-15T18:09:12.653 回答
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

于 2013-10-15T15:32:57.560 回答