按索引数组过滤数组

时间:2018-02-06 13:03:17

标签: javascript arrays

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

所以,给定:

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

我想回复:

output = [4775453877338112, 6605041225957376]

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

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

道歉,如果这个简单的问题与此重复:Filter array based on an array of index,但是下划线让我失望。

10 个答案:

答案 0 :(得分:7)

  

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

因为您正在检查如果<{1}}中存在索引,而不是项目本身

只需使用arr2

即可
map

<强>演示

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

答案 1 :(得分:4)

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

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

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

const output = arr2.map(i => arr1[i])

console.log(output)

答案 2 :(得分:3)

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

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

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

结果:

Array [ 4775453877338112, 6605041225957376 ]

答案 3 :(得分:1)

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

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);

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

尝试以下方法: `

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

let result = arr1.filter(i => arr2.includes(arr1.indexOf(i)))
console.log(result);

`

答案 6 :(得分:0)

试试这个

<!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>

答案 7 :(得分:0)

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

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]);
  }
}

答案 8 :(得分:0)

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

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

答案 9 :(得分:-1)

无论值的类型如何,都要更具体,请使用反射概念。

import java.lang.reflect.Array; 。 。

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

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

的System.out.println(○);

}

输出: 1 7