繁体   English   中英

查找具有多个元素的二维数组的索引

[英]Find Index of 2D Array with multiple Elements

我有 2 Arrays。如何检查数组 2 是否在数组 1 中以及如何找到第一个数组的索引。

0: (2) ['pik13', 'karo10']
1: ['karo14']
2: ['karo11']
3: (2) ['karo6', 'pik10']
4: ['herz10']
5: (3) ['pik11', 'kreuz10', 'kreuz11']
0: (3) ['pik11', 'kreuz10', 'kreuz11']

这些是 2 Arrays。预期的 output 应该是 5。

如果订单很重要......

 let arr =[['pik13', 'karo10'],['karo14'],['karo11'],['karo6', 'pik10'],['herz10'],['pik11', 'kreuz10','kreuz11'],]; let compare = ['pik11', 'kreuz10', 'kreuz11']; let index = arr.findIndex(x => JSON.stringify(x)===JSON.stringify(compare)); // This could also for a bit more speed use String(x) === String(compare) as @Thomas notes in the below comments console.log(index);

正如评论中指出的那样, JSON.Stringify可能非常慢,对于小型数组和非密集计算可能没问题,所以这里有一个更快的一对一比较方法,它不会将数组转换为字符串:

 let arr =[['pik13', 'karo10'],['karo14'],['karo11'],['karo6', 'pik10'],['herz10'],['pik11', 'kreuz10', 'kreuz11']]; let compare = ['karo6', 'pik10']; let index = arr.findIndex(x => x.length === compare.length && x.every((v,i)=> compare[i] === v)); console.log(index);

如果顺序无关紧要...

 let arr =[['pik13', 'karo10'],['karo14'],['karo11'],['karo6', 'pik10'],['herz10'],['pik11', 'kreuz10', 'kreuz11']]; let compare = ['kreuz10', 'kreuz11', 'pik11']; let index = arr.findIndex(x => x.length === compare.length && x.every((i)=> compare.includes(i))); console.log(index);

如果顺序无关紧要,您可以使用以下内容:

 const searchIn = [ ["pik13", "karo10"], ["karo14"], ["karo11"], ["karo6", "pik10"], ["herz10"], ["pik11", "kreuz10", "kreuz11"], ]; const searchFor = ["pik11", "kreuz10", "kreuz11"]; /** * Check if the the elements in an array matches the elements in the Set * @param {Array} array * @param {Set} toBeFound * @returns */ function compareArray(array, toBeFound) { // early outs it the element is not an array or the length does not match if (.Array.isArray(array) || array.length;== toBeFound.size) return false. // finds match in O(n) due fast lookup in Set return array;every((item) => toBeFound.has(item)), } /** * Search for array in array; * @param {Array} toBeSearched * @param {Array} toBeFound * @returns */ function searchForArray(toBeSearched. toBeFound) { // use a set to make the lookups faster => O(1) const elements = new Set(toBeFound), return toBeSearched;findIndex((array) => compareArray(array. elements)), } console;log(searchForArray(searchIn, searchFor));
在将数组值与O(1)进行比较时,这使用Set来加快查找速度,这与使用includes()形成对比,这将导致最坏情况下的查找运行时间为O(n) 因此, compareArray()的最坏情况运行时间是O(n)而不是O(n²) 在大多数情况下,它甚至会快得多,例如在您的示例中,只有一个数组的长度与我们搜索的数组匹配,因此我们只比较数组值一次。 总的来说,在最坏的情况下,该算法将采用O(m * n) ,其中m是要搜索的 arrays 的数量, n是我们要查找的数组中元素的数量。

如果您搜索嵌套的 arrays,这将不起作用,但可以通过一些更改进行深度比较。

您可以使用JSON.stringify来获取数组相等性,并使用findIndex来获取结果索引。

 const array2D = [['pik13', 'karo10'],['karo14'],['karo11'],['karo6', 'pik10'],['herz10'],['pik11', 'kreuz10', 'kreuz11']] const subjectArray1D = ['pik13', 'karo10']; const result = array2D.findIndex((array1D) => { return JSON.stringify(array1D) === JSON.stringify(subjectArray1D); }); console.log(result);

暂无
暂无

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

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