循环通过具有条件的数组

时间:2017-01-30 14:23:21

标签: javascript

我很难搞清楚如何循环数组,如果数组中确实存在某些项目,我想执行一个.slice(0,16)来过滤已经存在的数组(让我们称之为现有数组“路由”)。

例如,先前的过程将产生以下数组:

points = ['=00ECY20WA200_RECV_P1SEL',
'=00ECY20WA200_RECV_P2SEL',
'=00RECV_C1A_EINCSCMPP1',
'=00RECV_C1A_EINCSCMPP2',
'=00BYPS_C1A_EINCSCMP',
'=00ECY20WA200_BYPS_SPSL1',
'=00ECC92AG184YB01',
'=00ECC92AG185YB01',
'=00ECC92AG186YB01',
'=00ECC92AG187YB01',
]

因此,如果“points”数组中存在上述任何项目,在这种情况下它们都会存在(但在某些情况下它可能只是现有10个项目中的1个),我正在尝试执行路由.slice(0,16)到另一个已经存在的数组。

我已经尝试了很多不同的方法(对于带有if语句的循环),此时我不确定它是我的语法还是什么,但是我回到了0的方位而且我甚至没有有效的代码片段。任何方向将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以使用哈希表进行检查和过滤。

var points = ['=00ECY20WA200_RECV_P1SEL', '=00ECY20WA200_RECV_P2SEL', '=00RECV_C1A_EINCSCMPP1', '=00RECV_C1A_EINCSCMPP2', '=00BYPS_C1A_EINCSCMP', '=00ECY20WA200_BYPS_SPSL1', '=00ECC92AG184YB01', '=00ECC92AG185YB01', '=00ECC92AG186YB01', '=00ECC92AG187YB01'], 
    hash = Object.create(null),
    filtered = points.filter(function (a) {
        if (!hash[a.slice(0, 16)]) {
            hash[a.slice(0, 16)] = true;
            return true;
        }
    });
              
console.log(filtered);                 

ES6 with Set

var points = ['=00ECY20WA200_RECV_P1SEL', '=00ECY20WA200_RECV_P2SEL', '=00RECV_C1A_EINCSCMPP1', '=00RECV_C1A_EINCSCMPP2', '=00BYPS_C1A_EINCSCMP', '=00ECY20WA200_BYPS_SPSL1', '=00ECC92AG184YB01', '=00ECC92AG185YB01', '=00ECC92AG186YB01', '=00ECC92AG187YB01'], 
    pSet = new Set,
    filtered = points.filter(a => !pSet.has(a.slice(0, 16)) && pSet.add(a.slice(0, 16)));
              
console.log(filtered);                 

答案 1 :(得分:1)

编辑:所以看起来你想从点数组中的每个元素中删除一个名为routes的数组中的元素。这就是你如何做到这一点:

function removeBrokenRoutes(brokenPoints, routes){
    for(let pt of brokenPoints){
        let index = routes.indexOf(pt);
        if(index !== -1) routes.splice(index,1);
    }
    return routes;
}

请记住,数组越大,完成的时间就越长。

答案 2 :(得分:0)

您可以组合使用filterindexOf方法:

var arr = [/* all the data you're checking against */];
var points = [/* the data you're checking for */];
var filteredArr = arr.filter(function(x) {
     // will return -1 if the point is not found
     return points.indexOf(x) !== -1;
});

filteredArr将包含两个数组中出现的所有点。 filter函数通过使用带有一个参数x的函数来工作,该函数表示数组中的每个项目。如果函数返回true,则该项将被添加到新数组(filteredArr),如果为false,则该函数将继续执行下一项。 indexOf将检查是否在另一个数组中找到该项。另外需要注意的是,如果数据集非常非常大,则需要更复杂的解决方案(例如哈希表),因为这不一定是性能最高的方法。但它很容易理解,因此它是一个很好的起点。