Javascript:反转document.getElementByClassName数组

时间:2016-01-01 21:36:23

标签: javascript

我有这个变量:

var stars = this.parentNode.children

,其值为:

[span.rate, span.rate, span.rate.rated, span.rate.rated, span.rate.rated]

现在我要反转它,但如果我尝试:

stars.reverse()

我获得了

Uncaught TypeError: stars.reverse is not a functionupdateRateStar @ app.js:75(anonymous function) @ app.js:98

我无法理解为什么它适用于如下数组:

[1,2,3]

所以,如果我尝试:

[1,2,3].reverse()

它有效。因此我无法理解这个问题

4 个答案:

答案 0 :(得分:6)

您无法在Array.prototype.reverse上致电NodeListCollection。相反,你应该使用:

var stars = [].slice.call(stars, 0).reverse()

答案 1 :(得分:4)

使用

var revArray = Array.prototype.slice.apply( a ).reverse()

原因是你有一个NodeList而不是一个数组。在许多情况下,两者的行为相似,但NodeList没有数组方法。

使用

Array.prototype.slice.apply( a )

部分,我们将NodeList转换为一个数组,而不是可以反转的。

答案 2 :(得分:2)

这是一个NodeList,它没有反向。您可以使用:

告诉对象的原型(如其他语言中的类)
Object.prototype.toString.call(stars)

返回[object NodeList]。数组将返回[object Array]

如果您拥有原型(即,这不是库),您可以运行:

NodeList.prototype.reverse = Array.prototype.reverse

然后

stars.reverse()

会工作吗?与不断借用Array的方法相比,这更符合逻辑和令人愉悦。

再次,你在这里拥有原型,请注意,如果浏览器将来添加原型,你可以修复它。你可能更喜欢:

NodeList.prototype.sirkoReverse = Array.prototype.reverse

哪些仍然可以很好地阅读,但不太可能发生冲突。

答案 3 :(得分:1)

它有不同的类型,例如 NodeList 数组

我建议你使用这个功能:

var reverse = function(arr) {
   var result = [];
   for (var i = arr.length - 1;i !== 0;i--) {
       result.push(arr[i]);
   }
   return result;
}

第二种变化:

function xorSwapHalf(array)
{
    var i = null;
    var r = null;
    var length = array.length;
    for (i = 0; i < length / 2; i += 1)
    {
        r = length - 1 - i;
        var left = array[i];
        var right = array[r];
        left ^= right;
        right ^= left;
        left ^= right;
        array[i] = left;
        array[r] = right;
    }
    return array;
}

另一种称为解构分配的交换方法:http://wiki.ecmascript.org/doku.php?id=harmony:destructuring

解构分配:

function destructuringSwap(array)
{
    var left = null;
    var right = null;
    var length = array.length;
    for (left = 0, right = length - 1; left < right; left += 1, right -= 1)
    {
        [array[left], array[right]] = [array[right], array[left]];
    }
    return array;
}