问题是这样的:我想在一个列表里面找到某个元素的下标,这个列表的每个元素本身也是列表,比如
var arr = [[0, 1], [2, 3], [4, 5]]; var item = [0, 1]; var index = arr.indexOf(item); console.log(index);
输出的是 -1,但是明明 arr 里面包含 [0, 1] 啊?
在 python 里面这个问题就不存在:
index = arr.index(item) print(index)
可以输出 0。
请问在 js 中应怎么写?
![]() | 1 xjp 2018-10-11 13:01:38 +08:00 via iPhone js 里对象是引用 值一样并不一定相等 要指向同一个对象才是相等 python 本来也是这样 不过 python 有对等于计算进行重载__eq__() 值一样就认为相等 |
![]() | 2 yanm1ng 2018-10-11 13:04:59 +08:00 var arr = [[0, 1], [2, 3], [4, 5]]; var item = [0, 1]; var index = arr.map(el => el.join('.')).indexOf(item.join('.')); console.log(index); |
![]() | 3 crs0910 2018-10-11 13:45:40 +08:00 ``` const findIndex = arr.findIndex(_ => _ + '' === item +'') ``` |
![]() | 4 crs0910 2018-10-11 13:48:46 +08:00 const find = (arr, target) => arr.findIndex(_ => _ + '' === target +'') |
![]() | 5 pkokp8 2018-10-11 14:19:22 +08:00 via Android js 是两个变量,这样就是 0 了 var item = [0, 1]; var arr = [item, [2, 3], [4, 5]]; var index = arr.indexOf(item); console.log(index); python,这两个变量指向同一个地址 id(item) id(arry[arr.index(item)]) |
![]() | 6 rabbbit 2018-10-11 14:25:24 +08:00 ![]() var arr = [[0, 1], [2, 3] [4, 5]]; var getIndexFromArr = function (item, arr) { var itemLen = item.length; for (var i = 0, arrLen = arr.length; i < arrLen; i++) { if (arr[i].length !== itemLen) break; for (var j = 0, sign = true; j < itemLen; j++) { if (arr[i][j] !== item[j]) { sign = false; break; } } if (sign) return i; } return -1; } console.log(getIndexFromArr([0, 1], arr) === 0); console.log(getIndexFromArr([2, 3], arr) === 1); console.log(getIndexFromArr([4, 5], arr) === 2); console.log(getIndexFromArr([0, '1'], arr) === -1); console.log(getIndexFromArr([1, 0], arr) === -1); console.log(getIndexFromArr([0, 2], arr) === -1); console.log(getIndexFromArr([0], arr) === -1); console.log(getIndexFromArr([0, 1, 2], arr) === -1); console.log(getIndexFromArr([2, 3, 4], arr) === -1); |
![]() | 7 pkokp8 2018-10-11 14:27:44 +08:00 via Android @pkokp8 js var item = [0, 1]; var arr = [item, [2, 3], [4, 5]]; arr[0] === item;//true arr = [[0, 1], [2, 3], [4, 5]]; arr[0] === item;//false |
![]() | 8 rabbbit 2018-10-11 14:50:14 +08:00 if (arr[i].length !== itemLen) break; -> if (arr[i].length !== itemLen) continue; |
![]() | 9 Hilong 2018-10-11 15:26:35 +08:00 via Android let a = [0,1] let b = [0,1] a===b. false |
![]() | 11 auroraccc 2018-10-11 19:59:00 +08:00 因为 [0, 1] === [0, 1] 返回 false 啊 可以用 findIndex 方法: var arr = [[0, 1], [2, 3], [4, 5]]; var item = [0, 1]; var index = arr.findIndex(ele => `${ele}` === `${item}`); console.log(index); |
![]() | 12 FakeLeung 2018-10-12 00:42:34 +08:00 via iPhone |
![]() | 15 g0thic 2018-10-12 09:24:27 +08:00 老哥,js 里 [0,1] == [0,1] 是返回 false 的,你理解这个就知道为啥了 |