我试图从数组'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);
}
答案 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;
}
您绝对不必使用push
和pop
来完成数组。
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