unique() for arrays in javascript

34 浏览
0 Comments

unique() for arrays in javascript

众所周知,在JavaScript中没有内置的函数来删除数组中的重复项。我注意到在jQuery中也缺少这个功能(它只有一个用于DOM选择的unique函数),而我找到的最常见的代码片段是对每个元素检查整个数组和它的子集(我认为效率不高),如下所示:

for (var i = 0; i < arr.length; i++)
    for (var j = i + 1; j < arr.length; j++)
        if (arr[i] === arr[j])
            //做一些事情

所以我自己写了一个函数:

function unique (arr) {
    var hash = {}, result = [];
    for (var i = 0; i < arr.length; i++)
        if (!(arr[i] in hash)) { //它在对象中也适用!至少在FF中是这样的
            hash[arr[i]] = true;
            result.push(arr[i]);
        }
    return result;
}

我想知道是否有其他算法被接受为这种情况的最佳算法(或者如果你发现任何明显的缺陷可以修复),或者在JavaScript中需要这个功能时你会怎么做(我知道jQuery不是唯一的框架,其他一些可能已经包含了这个功能)。

0
0 Comments

从上面的代码中可以看出,这是一个用于在JavaScript中从数组中获取唯一值的函数。该函数的目的是通过使用reduce()方法和Object.keys()方法来实现。

该函数的出现是为了解决在JavaScript中获取数组中的唯一值的问题。在JavaScript中,数组是一种常见的数据结构,通常包含重复的元素。有时候,我们需要从数组中获取唯一的值,即去除重复的元素。然而,JavaScript本身并没有提供直接获取数组中唯一值的方法,因此需要使用自定义的函数来实现。

解决方法是通过使用reduce()方法和Object.keys()方法来实现。reduce()方法用于对数组中的每个元素进行迭代,并将结果累积到一个最终值中。在此函数中,reduce()方法用于将数组中的每个元素作为对象的属性,并将其值设置为1。然后,使用Object.keys()方法获取对象的所有属性,即数组中的唯一值。最后,使用map()方法将结果转换为数字类型。

通过将以上内容整理成一篇文章,我们可以得到以下内容:

在JavaScript中,获取数组中的唯一值是一个常见的需求。然而,JavaScript本身并没有提供直接获取数组中唯一值的方法。因此,我们需要使用自定义的函数来实现此功能。

下面是一个用于在JavaScript中获取数组中唯一值的函数:

function uniqueNum(arr) {
    return Object.keys(arr.reduce(
        function(o, x) {o[x]=1; return o;}, {})).map(Number);
}

该函数使用了reduce()方法和Object.keys()方法来实现。reduce()方法用于对数组中的每个元素进行迭代,并将结果累积到一个最终值中。在此函数中,reduce()方法用于将数组中的每个元素作为对象的属性,并将其值设置为1。然后,使用Object.keys()方法获取对象的所有属性,即数组中的唯一值。最后,使用map()方法将结果转换为数字类型。

使用该函数,我们可以轻松地从数组中获取唯一值。例如,我们可以将以下数组作为参数传递给该函数:

var arr = [1, 2, 2, 3, 3, 4, 5];
var uniqueArr = uniqueNum(arr);
console.log(uniqueArr);

输出结果将是一个包含唯一值的数组:[1, 2, 3, 4, 5]。

总结起来,通过使用reduce()方法和Object.keys()方法,我们可以很方便地在JavaScript中获取数组中的唯一值。该函数的实现原理是将数组中的每个元素作为对象的属性,并将其值设置为1,然后使用Object.keys()方法获取对象的所有属性,即数组中的唯一值。最后,使用map()方法将结果转换为数字类型。

0
0 Comments

在这段内容中,介绍了在JavaScript中创建一个可以去除数组中重复元素的函数unique(arr)。该函数使用了对象字面量的方法,将数组元素作为对象的键,并利用对象键的唯一性来判断重复元素。通过遍历数组,将未重复的元素添加到结果数组中。

在原始的代码实现中,每次循环都要执行arr.length的查找操作,可以对其进行优化,将其存储在变量l中,避免重复查找。

函数的时间复杂度为O(n),其中n为数组的长度。比原始的O(n^2)的算法要优化得多。

接下来,作者介绍了不同算法的时间复杂度和适用场景。对于排序的标量值,使用修改后的算法可以得到最优解。但对于非标量值,使用或模仿已讨论的库中的uniq方法将是最佳选择。

在代码实现中,作者建议使用hash.hasOwnProperty(arr[i])来判断键是否存在,而不使用in操作符,因为in操作符会返回继承的属性,而hasOwnProperty只会判断自身属性。

此外,作者提到了使用result[result.length] = arr[i];来替代push()方法的优化方式,但强调这只是微小的优化,主要关注的是算法复杂度的优化。

,该文章介绍了一种在JavaScript中去除数组中重复元素的函数实现,并提供了不同算法的时间复杂度和适用场景的比较,以及优化方法的讨论。该函数的实现简洁高效,适用于大多数场景下的数组去重需求。

0
0 Comments

在JavaScript中,如果我们想要从一个数组中提取出唯一的值,即去除重复项,我们可以使用不同的方法来实现。然而,有时候我们可能会遇到一些问题,导致我们的方法无法正常工作。下面我们将讨论一个特定的问题:如何在JavaScript中获取数组中的唯一值(unique() for arrays in javascript),并提供解决方法。

问题的原因在于,当数组中包含具有字符串表示形式的对象或函数时,我们无法像预期的那样去重。这是因为在对象(在这里是“hash”对象)中,只能使用字符串作为键。因此,我们需要遍历结果数组,以查找新的条目是否已经存在。尽管这种方法仍然比第一种方法快,但效率仍然不高。

为了解决这个问题,我们可以借鉴Prototype JS中的“uniq”方法的实现。通过查看它的代码,我们可以得到一些灵感。此方法可以帮助我们解决字符串表示形式的问题。

然而,第一种方法也存在另一个问题,即对于对象也无法正常工作。如果我理解你的意思正确,即===在对象上不起作用。因此,假设数组只包含可以直接使用==或===进行比较的“标量”(例如整数、浮点数、布尔值、字符串),那么你是否仍然认为第二种方法不起作用呢?实际上,==在对象引用上的工作正常。所以,第二种方法仍然有效,并且如果数组只包含标量值,它将比第一种方法更快。

,第一种方法在一般情况下更好,而第二种方法在“标量”情况下更好。根据我们的需求和数组的特点,我们可以选择使用哪种方法。

当我们在JavaScript中需要获取数组中的唯一值时,我们可能会遇到一些问题,特别是当数组中包含具有字符串表示形式的对象或函数时。为了解决这个问题,我们可以参考其他库中的实现方法,并根据具体情况选择合适的方法。通过这种方式,我们可以更有效地获取数组中的唯一值。

0