V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zemora
V2EX  ›  问与答

问个 javascript 里面的 indexOf 的问题

  •  
  •   zemora · 2018-10-11 12:43:56 +08:00 · 1763 次点击
    这是一个创建于 1996 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    15 条回复    2018-10-12 09:24:27 +08:00
    xjp
        1
    xjp  
       2018-10-11 13:01:38 +08:00 via iPhone
    js 里对象是引用 值一样并不一定相等 要指向同一个对象才是相等

    python 本来也是这样 不过 python 有对等于计算进行重载__eq__() 值一样就认为相等
    yanm1ng
        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);
    crs0910
        3
    crs0910  
       2018-10-11 13:45:40 +08:00
    ```
    const findIndex = arr.findIndex(_ => _ + '' === item +'')
    ```
    crs0910
        4
    crs0910  
       2018-10-11 13:48:46 +08:00
    const find = (arr, target) => arr.findIndex(_ => _ + '' === target +'')
    pkokp8
        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)])
    rabbbit
        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);
    pkokp8
        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
    rabbbit
        8
    rabbbit  
       2018-10-11 14:50:14 +08:00
    if (arr[i].length !== itemLen) break;
    ->
    if (arr[i].length !== itemLen) continue;
    Hilong
        9
    Hilong  
       2018-10-11 15:26:35 +08:00 via Android
    let a = [0,1]
    let b = [0,1]
    a===b. false
    Trim21
        10
    Trim21  
       2018-10-11 19:22:12 +08:00 via Android
    @rabbbit 歪楼问下这是什么编辑器…
    auroraccc
        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);
    FakeLeung
        12
    FakeLeung  
       2018-10-12 00:42:34 +08:00 via iPhone
    Trim21
        13
    Trim21  
       2018-10-12 00:45:22 +08:00 via Android
    @FakeLeung 行吧…
    Trim21
        14
    Trim21  
       2018-10-12 00:49:33 +08:00 via Android
    @Trim21 本来想夸编辑器挺漂亮,没想到是专门生成出来晒代码的,感觉被欺骗了感情…
    g0thic
        15
    g0thic  
       2018-10-12 09:24:27 +08:00
    老哥,js 里 [0,1] == [0,1] 是返回 false 的,你理解这个就知道为啥了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2762 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 12:22 · PVG 20:22 · LAX 05:22 · JFK 08:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.