【问题标题】:Javascript: targeting and deleting array objects with for loopJavascript:使用 for 循环定位和删除数组对象
【发布时间】:2013-09-24 20:36:25
【问题描述】:

我在 javascript 中创建了一个包含对象的数组。 这就是我得到的:

object[
   {position:1, value:23}, 
   {position:34, value:22 }, 
   {position:2, value:10},
   {position:35,value:9}.....
]

所以我想创建一个 for 循环,删除那些目标对象 (例如destination =(object1.position - object2.position) *-1) 低于18 到以前的对象。

例如:object[2].position 与 object[0].position 相差 1 个位置,因此不再需要 object[2]。 object[3] 也一样 ... 35 - 34 = 1 / 1

这就是我写的:

myfullarray = [
    {pos:1,value:23},
    {pos:34,value:22},
    {pos:2,value:10},
    (...)
]
myarray = [];
myarray[0] = {
    pos:myfullarray[0].pos,
    value:myfullarray[0].value
}

for(i=1;i<myarray.length;i++){
    for(d=i;d>0;d--){
      mydest = myfullarray[i].pos-myfullarray[d].pos;
      if(mydest<0){
        mydest *= -1
      }
      if(mydest<18){
      }else{

        myarray[myarray.length + 1] = {
          value:myfullarray[i].value,
          pos:myfullarray[i].pos
        };
      }
    }
 }

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 真正的问题是什么?您的代码做了哪些您不希望它做的事情,或者您想弄清楚它遗漏了什么?
  • 我看不到 splice()pop()shift()... 所以,您肯定没有删除任何项目。
  • 好吧,我的问题是我的代码没有工作......当我查看我的数组时,我得到了 1884 个对象......它应该在 3 或 15 左右
  • @canon 是的,那是因为我试图不删除数组中的对象,因为这可能会给 for 循环带来很多麻烦。如果您查看代码,您可能会看到我调用 code(myarraylength)

标签: javascript arrays object for-loop


【解决方案1】:

这是一个避免二次迭代的建议。创建一个新数组。然后遍历整个数组,跟踪到目前为止的最小和最大位置,如果当前对象的位置距离最小值和最大值小于 18,则将其添加到新数组中。

编辑:这是代码的快速编写。

myFullArray = ...
myArray = [];
myArray[0] = myFullArray[0];
var min = myArray[0].pos;
var max = myArray[0].pos;
var current;
for (i = 1; i < myFullArray.length; i++) {
    current = myFullArray[i].pos;
    if (Math.abs(current - min) < 18) && Math.abs(current - max) < 18)
    {
        myArray.push(myFullArray[i]);
        if (current < min)
            min = current;
        else if (current > max)
            max = current;
    }
}

【讨论】:

  • 这实际上取决于您的确切问题。您可能会遇到一个对象,其位置距离最小值和最大值之间的值大于 18。如果你关心这一点,这可能会失败。仅当您考虑与当前最低和最高位置的距离时,这才有效。
  • 实际上,对不起,我上次评论的错误。应该适用于所有值,因为边界将基于列表的第一个值。最小值或最大值始终与您添加的第一个位置相距最多 17,因此不会添加任何比任一边界更远的位置。如果当前考虑的值距离最小值不够远,它将距离最大值足够远,反之亦然。
【解决方案2】:

如果您想更接近原来的算法,这应该可以做到。

myfullarray = [
    {position:1, value:23}, 
    {position:34, value:22 }, 
    {position:2, value:10},
    {position:35,value:9}
]
myarray = [];
myarray[0] = {
    pos:myfullarray[0].position,
    value:myfullarray[0].value
}
myfullarray.splice(0,1);

var mindest = 18;

for(i=0;i<myarray.length;i++){
    var myobject = myarray[i];
    for(d=i;d<myfullarray.length;d++){
      mydest = myobject.position-myfullarray[d].position;
      if(mydest<0){
        mydest *= -1
      }
      if(mydest<mindest){
          myfullarray.splice(d, 1);
      }
    }

    if (i < myfullarray.length) {
        myarray.push(myfullarray[i]);
        myfullarray.splice(i,1);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2020-01-05
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多