RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1423950
Accepted
Zhihar
Zhihar
Asked:2022-08-26 03:34:24 +0000 UTC2022-08-26 03:34:24 +0000 UTC 2022-08-26 03:34:24 +0000 UTC

javascript:为数组设置

  • 772

告诉我它是否可以用来Set只留下唯一的数组

那些。所以[[1, 2, 3], [1, 3, 4], [1, 2, 3], [1, 2, 3]] 只有[[1, 2, 3], [1, 3, 4]]

还是有其他方法可以做到这一点?

我不想通过在数组中搜索每个元素

javascript производительность
  • 4 4 个回答
  • 131 Views

4 个回答

  • Voted
  1. Best Answer
    Stanislav Volodarskiy
    2022-08-26T04:42:11Z2022-08-26T04:42:11Z

    我们将数组保存为字符串,Set可以正确处理字符串,我们将过滤后的字符串转换为数组:

    arrays = [[1, 2, 3], [1, 3, 4], [1, 2, 3], [1, 2, 3]];
    result = [
        ...new Set(arrays.map(a => JSON.stringify(a)))
    ].map(s => JSON.parse(s));
    console.log(result);

    Set存储传递给它的对象而不重复。不幸的是,相同的数组在 JavaScript 中并不相等:

    console.log([1, 2, 3] == [1, 2, 3]);

    所以对于Set相同的数组看起来不同。不要急着骂语言——在 Python 中,set根本无法放置数组。这本书的页边空白太小,无法解释原因。没错,在 Python 中有元组(set完美地插入其中),但在 JavaScript 中却没有(在这里你可以有点争吵)。

    由于数组是不可能的,我们将它们转换为字符串。它Set适用于字符串:从语言的角度来看,相等的字符串实际上是相等的。

    所提出的方法有一个缺点:不是数组本身被过滤,而是它们的副本。这并不总是很方便,但您可以使用Map解决它。显示已创建<строка>: <массив>。键不重复,原始数组进入结果。我们还节省了JSON.parse:

    arrays = [[1, 2, 3], [1, 3, 4], [1, 2, 3], [1, 2, 3]];
    result = [...new Map(arrays.map(a => [JSON.stringify(a), a])).values()];
    console.log(result);

    • 5
  2. Alexander Lonberg
    2022-08-26T04:35:03Z2022-08-26T04:35:03Z

    不。插入数组时,会在 Set 中设置一个引用,并且还会检查它是否重复。

    你必须写这样的东西:

    // Неупорядоченное сравнение элементов массива
    function isEquals (a1, a2) {
      const length = a1.length
      if (length !== a2.length) return false
      const indexes = [...Array(length).fill(0).keys()]
      const includes = (e) => {
        for (let i = 0; i < indexes.length; ++i) {
          if (e === a2[indexes[i]]) {
            indexes.splice(i, 1)
            return true
          }
        }
        return false
      }
      for (let i = 0; i < length; ++i) {
        if (!includes(a1[i])) return false
      }
      return true
    }
    
    function uniq (arrs) {
      const result = []
      for (let i = 0; i < arrs.length; ++i) {
        if (!result.some((e) => isEquals(arrs[i], e))) 
          // если копируем добавим .slice()
          result.push(arrs[i].slice())
      }
      return result
    }
    
    const arr = [[1, 2, 3], [1, 3, 4], [1, 2, 3], [1, 2, 3],
      // можно даже перемешать массив, он тоже будет пропущен
      [3, 2, 1]
    ]
    console.log(uniq(arr))

    • 1
  3. ΝNL993
    2022-08-26T04:33:03Z2022-08-26T04:33:03Z

    如果在 Set 的输入处第一个参数是一个数组,那么它已经从它创建了一个新的 Set,并且不会触及其余部分。

    例子:

    console.log([...new Set([1, 2, 3], [1, 2, 3], [4, 5, 6], 7, 8, 9).keys()])

    如果通过 方法添加数组add,则 Set 将数组“转换”为Symbol(简单地说:一个唯一的对象),也就是说,对于 Set,这将是两个唯一的数组(Symbol),因此它不会触及它们。

    例子:

    let s = new Set
    s.add([1, 2, 3])
    s.add([1, 2, 3])
    s.add([4, 5, 6])
    let keys = [...s.keys()]
    console.log(keys)
    console.log(keys[0] === keys[1]) // [1, 2, 3] === [1, 2, 3] // не совсем корректное выражение, но суть вы поняли

    要检查数组并删除非唯一数组,您可以进行简单检查。

    编码:

    let arr = [
        [1, 2, 3],
        [1, 2, 3],
        [4, 5, 6],
        [4, 5, 6]
      ]
    
    arr.filter((e, i, a) => {
        return a.splice(i, 1).includes(e)
    }) 
    
    console.log(arr)

    • 0
  4. Qwertiy
    2022-08-27T05:06:14Z2022-08-27T05:06:14Z

    如果可以为数组分配唯一值,则可以使用 map:

    var data = [[1, 2, 3], [1, 3, 4], [1, 2, 3], [1, 2, 3]]
    
    function toKey(a) {
      return a + ""
    }
    
    var res = [...new Map(data.map(x => [toKey(x), x])).values()]
    
    console.log(res)
    .as-console-wrapper.as-console-wrapper { max-height: 100vh }

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5