gpt4 book ai didi

JavaScript 数组原型(prototype)的独特方法

转载 作者:行者123 更新时间:2023-11-28 12:04:00 25 4
gpt4 key购买 nike

关闭。这个问题是off-topic .它目前不接受答案。












想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。

9年前关闭。




Improve this question




澄清:

正如一些人所指出的,这看起来确实像“这段代码可以吗”之类的问题。我真正好奇的主要事情是:.hasOwnProperty 是怎么回事?方法有效吗?我的意思是:IE 的 JScript 引擎(至少小于 9)并不总是使用哈希表,所以我认为它只是迭代该对象的所有属性,然后检查它是否获得这些属性从原型(prototype)链更高的另一个对象。这是一个公平的假设吗?毕竟:在某种程度上,每个代码都被翻译成循环和分支,但如果 IE 不做哈希表,那不意味着 .hasOwnProperty只是一些糖,就在那里,所以你不必编写循环?我想我是从 DC 的一篇博客文章或视频中得到这个概念的,很可能他在谈论数组,以及它们在 JS 中是(或者更确切地说:可以是)的古怪事物。我找不到视频/博客帖子(?)自动取款机。鉴于 JS 数组经常被滥用,我认为你们中的许多人都会同意,我认为这个问题的答案可以作为一个不错的引用。这就是为什么我没有在codereview上发布它。

就目前的答案而言,由于我的问题是从错误的 Angular 开始的(更关注代码而不是其背后的机制),所以让我老生常谈,感谢大家指出我没有指出的问题考虑到。

最近,我为我正在编写的一个脚本扩充了数组原型(prototype)(暂时不要拍摄)。为了不重新发明轮子,我去搜索了一些其他人如何做的例子。

奇怪This is quite common ,这显然是不必要的复杂。我还找到了this, as an alternative ,除了发帖者对他的快速算法相当沾沾自喜之外,我仍然觉得还有改进的余地。

我知道我现在可能会成为一个自鸣得意的聪明人,我的 unique方法实际上是这样的:

Array.prototype.unique = function()
{
'use strict';
var i,obj,ret;
ret = [];
obj = {};
for (i=0;i<this.length;i++)
{
if (!obj.hasOwnProperty(this[i]))
{
ret.push(this[i]);
obj[this[i]] = i;
}
}
return ret;
};

这样,就不需要第二个循环 AFAIK,是吗?当然,除非 hasOwnProperty方法非常慢,但不知何故我怀疑,在这种情况下:链只能返回 1 级,到 Object.prototype .

我发布的第二个链接包含一些统计数据和速度比较,但众所周知,它们在现实世界中几乎没有任何意义。谁能指出关于 JS 和基准测试的好文章的方向(除了 John Resig's 博客上的那篇文章?

所以,出于好奇:你们中有人发现这种方法有问题吗?更多信息:Object.prototype:未更改, undefinedundefined ,没有全局变量没有框架,而且这个方法不是盲目的实现( if (!Array.prototype.unique){...})

最佳答案

这是一个正确考虑类型的实现,比简单的嵌套循环快得多,并保持原始数组的顺序:

Array.prototype.unique = function(){
var r, o, i, j, t, tt;
r = [];
o = {};
for(i = 0; i < this.length; i++){
t = this[i];
tt = o[t] = o[t] || [];
for(j = 0; j < tt.length; j++)
if(tt[j] === this[i])
break;
if(j == tt.length)
r.push(tt[j] = t);
}
return r;
}

我做了一个 JSPerf to compare these implementations .
  • unique1 是嵌套循环。
  • unique2 是您链接到的快速算法。
  • unique3 是您的版本。
  • unique4 是我的。
    已添加
  • unique5 是 Kooilnc 的回答
  • unique6 是 primvdb 的答案

  • 虽然 unique2 是最快的,但它有它认为 "1" 的问题。和 1作为平等。 unique4 在速度方面排在第三位,但比 unique1 快得多,并且输出正确。所有四种变体实际上都给出了不同的输出:
    => [1, "1", 1, 2, 3, 4, 1, 2, 3, "2", "3", "4", "true", "true", true].unique1()
    // ["1", 4, 1, 2, 3, "2", "3", "4", "true", true]

    => [1, "1", 1, 2, 3, 4, 1, 2, 3, "2", "3", "4", "true", "true", true].unique2()
    // [1, "2", "3", "4", true]

    => [1, "1", 1, 2, 3, 4, 1, 2, 3, "2", "3", "4", "true", "true", true].unique3()
    // [1, 2, 3, 4, "true"]

    => [1, "1", 1, 2, 3, 4, 1, 2, 3, "2", "3", "4", "true", "true", true].unique4()
    // [1, "1", 2, 3, 4, "2", "3", "4", "true", true]

    关于JavaScript 数组原型(prototype)的独特方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12041837/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com