基于节点JS中的其他数组筛选/搜索对象的JavaScript数组

基于节点JS中的其他数组筛选/搜索对象的JavaScript数组,javascript,arrays,node.js,Javascript,Arrays,Node.js,我有一个ID数组和一个JavaScript对象数组。我需要使用节点JS中的数组中的值过滤/搜索JavaScript对象数组 比如说 var id = [1,2,3]; var fullData = [ {id:1, name: "test1"} ,{id:2, name: "test2"} ,{id:3, name: "test3"} ,{id:4, name: "test4"} ,{id:5, name: "test5"} ]; 使用上述数据,因此我需要:

我有一个ID数组和一个JavaScript对象数组。我需要使用节点JS中的数组中的值过滤/搜索JavaScript对象数组

比如说

var id = [1,2,3];

var fullData = [ 
    {id:1, name: "test1"}
   ,{id:2, name: "test2"}
   ,{id:3, name: "test3"}
   ,{id:4, name: "test4"}
   ,{id:5, name: "test5"}
];
使用上述数据,因此我需要:

var result = [ 
    {id:1, name: "test1"}
   ,{id:2, name: "test2"}
   ,{id:3, name: "test3"}
];
我知道我可以通过这两个循环检查匹配的ID。但这是唯一的解决方法,还是有更简单、资源友好的解决方案


将要比较的数据量约为30-40k行。

这将通过以下方式实现:


请注意,IE 8或更低版本上不提供此
过滤器
功能,但。

这将通过以下方式实现:


请注意,IE 8或更低版本上不提供此
过滤器
功能,但。

这将通过以下方式实现:


请注意,IE 8或更低版本上不提供此
过滤器
功能,但。

这将通过以下方式实现:


请注意,IE 8或更低版本上不提供此
过滤器
功能,但是。

只要您从所有可能对象的未排序数组开始,就无法循环使用它。@Cerbrus的答案是一种很好的方法,使用
数组.prototype.filter
,但也可以使用循环

但您真的需要从所有可能对象的未排序数组开始吗?

例如,是否可以在这些对象进入阵列之前将其过滤掉?也许您可以在首次构建阵列时应用测试,以便测试失败的对象永远不会成为阵列的一部分。这将更加资源友好,如果它对您的特定应用程序有意义,那么它甚至可能更简单

function insertItemIfPass(theArray, theItem, theTest) {
    if (theTest(theItem)) {
        theArray.push(theItem);
    }
}

// Insert your items by using insertItemIfPass

var i;

for (i = 0; i < theArray.length; i += 1) {
    doSomething(theArray[i]);
}
函数insertitemiffass(数组、item、测试){
如果(测试(ITEEM)){
阵列推进(ITEEM);
}
}
//使用insertItemIfPass插入项目
var i;
对于(i=0;i
或者,您是否可以使用一个数据结构来跟踪对象是否通过了测试?如果您必须使用数组,那么最简单的方法就是为它保留一个索引。将对象添加到数组时,应用测试:如果对象通过,则将其在数组中的位置放入索引中。然后,当您需要从数组中取出对象时,可以查阅索引:这样,当您不需要首先接触大多数对象时,就不会浪费时间遍历数组。如果您有几个不同的测试,那么您可以保留几个不同的索引,每个测试一个索引。这需要更多的内存,但可以节省很多时间

function insertItem(theArray, theItem, theTest, theIndex) {
    theArray.push(theItem);
    if (theTest(theItem)) {
        theIndex.push(theArray.length - 1);
    }
}

// Insert your items using insertItem, which also builds the index

var i;

for (i = 0; i < theIndex.length; i += 1) {
    doSomething(theArray[theIndex[i]]);
}
函数插入项(数组、ITEEM、测试、索引){
阵列推进(ITEEM);
如果(测试(ITEEM)){
指数推力(数组长度-1);
}
}
//使用insertItem插入项目,这也会生成索引
var i;
对于(i=0;i
您可以对阵列进行排序,以便测试可以短路吗?想象一个设置,在该设置中,您已经设置了阵列,以便所有通过测试的内容都排在第一位。这样,一旦你击中第一个失败的项目,你就知道剩下的所有项目都会失败。然后您可以立即停止循环,因为您知道不再有任何“好”项目

//插入项目,将通过测试的项目放在未通过测试的项目之前
var i=0;
而(i<阵列长度){
如果(!测试(数组[i])){
打破
}
剂量测定法(theArray[i]);
i+=1;
}

底线是,这与其说是一个语言问题,不如说是一个算法问题。听起来您当前的数据结构(所有可能项的未排序数组)并不适合您的特定问题。根据应用程序还需要做什么,完全使用另一个数据结构或使用索引扩充现有结构可能更有意义。无论哪种方法,如果仔细计划的话,都会为您节省一些时间。

只要您从一个包含所有可能对象的未排序数组开始,就没有办法通过它进行迭代。@Cerbrus的答案是一种很好的方法,使用
Array.prototype.filter
,但您也可以使用循环

但您真的需要从所有可能对象的未排序数组开始吗?

例如,是否可以在这些对象进入阵列之前将其过滤掉?也许您可以在首次构建阵列时应用测试,以便测试失败的对象永远不会成为阵列的一部分。这将更加资源友好,如果它对您的特定应用程序有意义,那么它甚至可能更简单

function insertItemIfPass(theArray, theItem, theTest) {
    if (theTest(theItem)) {
        theArray.push(theItem);
    }
}

// Insert your items by using insertItemIfPass

var i;

for (i = 0; i < theArray.length; i += 1) {
    doSomething(theArray[i]);
}
函数insertitemiffass(数组、item、测试){
如果(测试(ITEEM)){
阵列推进(ITEEM);
}
}
//使用insertItemIfPass插入项目
var i;
对于(i=0;i
或者,您是否可以使用一个数据结构来跟踪对象是否通过了测试?如果您必须使用数组,那么最简单的方法就是为它保留一个索引。将对象添加到数组时,应用测试:如果对象通过,则将其在数组中的位置放入索引中。然后,当您需要从数组中取出对象时,可以查阅索引:这样,当您不需要首先接触大多数对象时,就不会浪费时间遍历数组。如果您有几个不同的测试,那么您可以保留几个不同的索引,每个测试一个索引。这需要更多的内存,但可以节省很多时间

function insertItem(theArray, theItem, theTest, theIndex) {
    theArray.push(theItem);
    if (theTest(theItem)) {
        theIndex.push(theArray.length - 1);
    }
}

// Insert your items using insertItem, which also builds the index

var i;

for (i = 0; i < theIndex.length; i += 1) {
    doSomething(theArray[theIndex[i]]);
}
<代码