繁体   English   中英

按索引数组过滤数组

[英]Filter array by array of indexes

我有第一个值数组和第二个索引数组。 我想过滤第一个数组,只返回第二个数组中有索引的值。

所以,给定:

arr1 = [4775453877338112, 5901353784180736, 6605041225957376]
arr2 = [0,2]

我想回复:

output = [4775453877338112, 6605041225957376]

谢谢。 对于奖励积分,为什么以下不起作用?

var output = arr1.filter( (item) => arr1.indexOf(item) in arr2 === true )

抱歉,如果这个简单的问题与此重复: 基于索引数组的过滤器数组 ,但是下划线让我失望。

对于奖励积分,为什么以下不起作用?

因为您正在检查arr2是否存在索引 ,而不是项目本身

只需使用map

var output = arr2.map( s => arr1[s] );

演示

 var arr1 = [4775453877338112, 5901353784180736, 6605041225957376]; var arr2 = [0,2]; var output = arr2.map( s => arr1[s] ); console.log( output ); 

var output = arr1.filter( (item) => arr1.indexOf(item) in arr2 === true ) indexOf返回元素的索引而不是布尔值。 您可以使用新的Array.prototype.includes或test for value为-1

此外,如果顺序相同,您可以循环索引数组。

 const arr1 = [4775453877338112, 5901353784180736, 6605041225957376] const arr2 = [0,2] const output = arr2.map(i => arr1[i]) console.log(output) 

您可能只需要一个简单的循环:

arr1 = [4775453877338112, 5901353784180736, 6605041225957376];
arr2 = [0,2];
arr3 = [];

for (i = 0; i < arr2.length; i++) {
    arr3.push(arr1[arr2[i]]);
}

结果:

Array [ 4775453877338112, 6605041225957376 ]

编写可读代码而不是复杂代码时,您的任务更容易:

 var arr1 = [4775453877338112, 5901353784180736, 6605041225957376]; var arr2 = [0,2]; var output = []; for (var i = 0; i < arr2.length; i++) { output.push(arr1[ arr2[i] ]); } console.log(output); 

这是一个不使用额外的空数组而没有嵌套for循环的解决方案。 也适用于O(n)而不是O(n ^ 2),这里有人建议。

var arr1 = [4775453877338112, 5901353784180736, 6605041225957376];
var arr2 = [0,2];

var result = arr2.map(i => arr1[i]);

尝试以下方法:`

 let arr1 = [4775453877338112, 5901353784180736, 6605041225957376] let arr2 = [0,2] let result = arr1.filter(i => arr2.includes(arr1.indexOf(i))) console.log(result); 

`

尝试这个

 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>JS Bin</title> </head> <body> <script src="https://code.jquery.com/jquery-3.1.0.js"></script> <script> $("document").ready(function(){ arr1 = [4775453877338112, 5901353784180736, 6605041225957376] arr2 = [0,2] $.each( arr2, function( key, value ) { alert( arr1[value]); }); }) </script> </body> </html> 

不使用lodash,这是一种解决方法。 不要使用arr.forEach,它比for慢。

const arr1 = [4775453877338112, 5901353784180736, 6605041225957376]
const arr2 = [0,2]
const finalArray = [];
let j = 0;
for (let i = 0, len = arr1.length; i < len; i++) {
  if(i==arr2[j]) {
    j++;
    finalArray.push(arr1[i]);
  }
}

修改输出变量,如下所示:

var output = arr1.filter((item) => arr2.includes(arr1.indexOf(item)));

为了更具体而不管价值的类型,使用反射概念。

import java.lang.reflect.Array;

int [] arr1 = {1,3,7}; int [] arr2 = {0,2};

for(var i = 0; i <arr2.length; i ++){Object o = Array.get(arr1,arr2 [i]);

的System.out.println(O);

}

输出:1 7

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM