JavaScript:从数组中提取一个元素

时间:2013-11-05 18:56:43

标签: javascript arrays

我试图从数组'shapes'中提取一个元素,其中该元素的id等于dragID。我想知道我是否以正确的方式做到了......在这里出现了很多问题,比如,有时会跳过一些元素,同时将它们从保留阵列推回到真正的数组。请告诉我是否有更好的方法来做.. ..

 var reserveShapes = [];
    while(1)
    {
        drag = shapes.pop();
        if(drag.id == dragID)
        {
             break;
        }
        reserveShapes.push(drag);   
    }

    //alert(reserveShapes.length);
    for(var j=0; j<reserveShapes.length; j++)
    {
        ar temp = reserveShapes.pop();
        shapes.push(temp);
    }

2 个答案:

答案 0 :(得分:3)

哇。你的想法可能有用,但有一个更清洁的方式:

var drag;
for (int i = 0; i < shapes.length; i++) {
    if (shapes[i].id == dragID) {
         drag = shapes[i];
         break;
    }
}

if (drag) {
    // a matching shape was found
    // ...
}

如果要从数组中的位置删除该元素,请使用splice

    if (shapes[i].id == dragID) {
        drag = shapes.splice(i, 1);
        break;
    }    

您绝对不必使用pushpop来完成数组。

EDIT参考资料显示您可以使用[]

访问数组

读数有点密集,但ECMA-262(JavaScript订阅的最新标准)的规范是http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf。在页67,它说:

Properties are accessed by name, using either the dot notation: 
    MemberExpression . IdentifierName 
    CallExpression . IdentifierName 
or the bracket notation: 
    MemberExpression [ Expression ] 
    CallExpression [ Expression ]

实际上允许在所有对象上使用[]访问器,并且数组是特殊对象。第122页定义了一个数组:

  

Array对象对某类属性名称进行特殊处理。当且仅当ToString(ToUint32(P))等于P且ToUint32(P)不等于2 ^时,属性名P(以String值的形式)是数组索引   32 - 1.属性名称为数组索引的属性也称为元素。每个Array对象都有一个length属性,其值始终是小于2 ^的非负整数   32。

这归结为“如果您使用数字作为对象属性的索引,则该对象将被视为数组。”

规范阅读相当密集,因此这里有一些在JavaScript中使用数组的简单参考:

答案 1 :(得分:1)

来自ECMAScript 5的稍微更现代的方法:

var drag;
shapes = shapes.filter( function (current) {
    if( current.id === dragID ) {
        drag = current;
        return false;
    }

    return true;
} );

请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter