簡體   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