问个 javascript 里面的 indexOf 的问题

2018-10-11 12:43:56 +08:00
 zemora

问题是这样的:我想在一个列表里面找到某个元素的下标,这个列表的每个元素本身也是列表,比如

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 中应怎么写?

1788 次点击
所在节点    问与答
15 条回复
xjp
2018-10-11 13:01:38 +08:00
js 里对象是引用 值一样并不一定相等 要指向同一个对象才是相等

python 本来也是这样 不过 python 有对等于计算进行重载__eq__() 值一样就认为相等
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);
crs0910
2018-10-11 13:45:40 +08:00
```
const findIndex = arr.findIndex(_ => _ + '' === item +'')
```
crs0910
2018-10-11 13:48:46 +08:00
const find = (arr, target) => arr.findIndex(_ => _ + '' === target +'')
pkokp8
2018-10-11 14:19:22 +08:00
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)])
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);
pkokp8
2018-10-11 14:27:44 +08:00
@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
rabbbit
2018-10-11 14:50:14 +08:00
if (arr[i].length !== itemLen) break;
->
if (arr[i].length !== itemLen) continue;
Hilong
2018-10-11 15:26:35 +08:00
let a = [0,1]
let b = [0,1]
a===b. false
Trim21
2018-10-11 19:22:12 +08:00
@rabbbit 歪楼问下这是什么编辑器…
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);
FakeLeung
2018-10-12 00:42:34 +08:00
Trim21
2018-10-12 00:45:22 +08:00
@FakeLeung 行吧…
Trim21
2018-10-12 00:49:33 +08:00
@Trim21 本来想夸编辑器挺漂亮,没想到是专门生成出来晒代码的,感觉被欺骗了感情…
g0thic
2018-10-12 09:24:27 +08:00
老哥,js 里 [0,1] == [0,1] 是返回 false 的,你理解这个就知道为啥了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/496656

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX