cqwcns 发表于 2021-12-22 16:13

JS多维数组indexOf的问题

我们有一个数组(arr),用于滚动选择器picker选择行政区域。
后台返回一个已选数据的数组(selected ),现在要通过“已选数据的数组”输出正确的picker值。
例如['深圳', '南山'],应该输出。


这个输出代码应该怎么写?没转过弯来,下面我尝试写了一下,未实现功能,求指教。

    const arr = [
      ['北京', '广州', '深圳', '曹县'],
      [
      ['天安门', '颐和园', '故宫'],
      ['天河', '荔湾', '珠江新城'],
      ['南山', '蛇口', '小梅沙'],
      ['山东', '齐鲁', '烟台']
      ]
    ],
      selected = ['深圳', '南山'],
      value = [];

    for (let i = 0; i < selected.length; i++) {
      value.push(arr.indexOf(selected))
    }

    console.log(value)

cqwcns 发表于 2021-12-22 16:22

这样可以实现,但感觉很傻,而且代码写死了。
DEMO的地址arr是二级的,如果改为三级,这个代码又不适用了。
    for (let i = 0; i < selected.length; i++) {
      if (i == 0) {
      value.push(arr.indexOf(selected))
      } else {
      value.push(arr].indexOf(selected))
      }
    }

看看各位有什么好的写法,谢谢

不苦小和尚 发表于 2021-12-22 16:36

深圳南山为什么是20啊

cqwcns 发表于 2021-12-22 16:40

不苦小和尚 发表于 2021-12-22 16:36
深圳南山为什么是20啊

深圳的index是2
南山的index是0

cqwcns 发表于 2021-12-22 16:41

自己研究了一下,初步解决了,代码兼容2级、3级,理论上多少级都可以。

分享代码,如果有改进建议,欢迎指教。

    const arr = [
      ['北京', '广州', '深圳', '曹县'],
      [
      ['天安门', '颐和园', '故宫'],
      ['天河', '荔湾', '珠江新城'],
      ['南山', '蛇口', '小梅沙'],
      ['山东', '齐鲁', '烟台']
      ],
      [
      [['天安门1', '天安门2'], ['颐和园1', '颐和园2'], ['故宫1', '故宫2']],
      [['天河1', '天河2'], ['荔湾1', '荔湾2'], ['珠江新城1', '珠江新城2']],
      [['南山1', '南山2'], ['蛇口1', '蛇口2'], ['小梅沙1', '小梅沙2']],
      [['山东1', '山东2'], ['齐鲁1', '齐鲁2'], ['烟台1', '烟台2']]
      ]
    ],
      selected = ['广州', '珠江新城', '珠江新城1'],
      value = [];

    for (let i = 0; i < selected.length; i++) {
      let range = arr;
      value.forEach(el => {
      range = range
      });
      value.push(range.indexOf(selected))

    }

    console.log(value)//

涛之雨 发表于 2021-12-22 18:41

如果想兼容性更高的话就要写自定义迭代器或者递归实现

unmask 发表于 2021-12-22 20:39

增加非法输入的兼容性

const value = selected.reduce((rs, c, i) => {
    const range = rs.reduce((r, x) => r || [], arr || []);
    rs.push(range.indexOf(c));
    return rs;
}, []);
页: [1]
查看完整版本: JS多维数组indexOf的问题