Javascript 2维数组indexOf

35

我有一个像这样的二维数组:

var arr = [[2,3],[5,8],[1,1],[0,9],[5,7]];

每个索引都存储一个包含某些元素坐标的内部数组。
如何使用 Array.indexOf() 检查新生成的坐标集是否已经包含在 arr 中?如果坐标不是重复的,我想将其推入 arr
这是我的尝试,但没有成功:
if (arr.indexOf([x, y]) == -1) {
    arr.push([x, y]);
}

看起来indexOf()对于二维数组不起作用...

12个回答

0

你可以使用这个一行代码的“findIndexIn2dArray”函数:

var arr = [[2,3],[5,8],[1,1],[0,9],[5,7]];
var pos = [0,9];


const findIndexIn2dArray = (array, search) => array.findIndex((n) => n.every((e, i) => search[i] !== undefined && search[i] === e));

const x = findIndexIn2dArray(arr, pos);

console.log(x);

以下是该函数的工作原理:

在数组参数上调用findIndex方法。此方法搜索数组以查找满足其接收到的回调函数中指定条件的第一个子数组。

传递给findIndex的回调函数接受一个参数n,该参数表示数组中的每个子数组。

对于每个子数组n,都会调用every方法。every方法检查子数组中的每个元素是否满足其接收到的回调函数中指定的条件。

传递给every的回调函数接受两个参数:e表示子数组中的每个元素,i表示元素在子数组中的索引。

回调函数检查搜索数组中的第i个元素是否未定义,并且它是否等于子数组n中的第i个元素。如果n子数组中的每个元素都满足这两个条件,则every方法返回true。

如果every方法对子数组n返回true,则findIndex方法返回该子数组在数组中的索引。如果数组中没有任何子数组符合搜索条件,则findIndex方法返回-1。

总的来说,该函数可用于基于子数组内容在二维数组中查找特定子数组的索引。


0
之前的回答说:

你不能使用indexOf来处理复杂的数组(除非你将其序列化,使每个坐标都变成字符串)...

这就是你要做的。如果你有一个非常大的数据集,我建议不要使用这种技术,因为它依赖于你的2D数组的副本。但对于合理的集合,它很简单。
使用一致的方法来展开数组元素,例如:
// Flatten array into a string, separating elements with a "unique" separator.
function stringle( arr ) {
  return arr.join(' |-| ');
}

对于您的示例来说,这可能有些过度,因为子数组包含整数,但它适用于更复杂的数据类型。(如果我们使用逗号作为默认分隔符,那么它将无法与包含逗号的字符串元素区分,例如。)

然后,目标数组可以被展平为一个字符串数组:

// Transmogrify arr into a String[], usable with indexOf()
var arrSearch = arr.map(function(row) { return stringle(row); });

然后您可以使用Array.indexOf()(或其他数组方法)来检查匹配项的存在或位置。

if (arrSearch.indexOf( stringle(newArray) ) === -1) ...

这段代码片段包含一个演示,其中包含多种数据类型。

// Example starting array
var arr = [[2,3],[5,8],[1,1],[0,9],[5,7]];

// Flatten array into a string, separating elements with a "unique" separator.
function stringle( arr ) {
  return arr.join(' |-| ');
}

snippet.log("arr: "+JSON.stringify(arr));

// Transmogrify arr into a String[], usable with indexOf()
var arrSearch = arr.map(function(row) { return stringle(row); });

snippet.log("arrSearch: "+JSON.stringify(arrSearch));

var tests = [[0, 9],[1, 2],["pig","cow"],[0,9,"unicorn"],["pig","cow"]];

for (var test in tests) {
  var str = stringle(tests[test]);
  if (arrSearch.indexOf(str) === -1) {
    arr.push(tests[test]);
    arrSearch.push(str);
    snippet.log("Added "+JSON.stringify(tests[test]));
  }
  else {
    snippet.log("Already had "+JSON.stringify(tests[test]));
  }
}

snippet.log("Result: "+JSON.stringify(arr));
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接