【问题标题】:Javascript (dynamic) insert into array, then shift all elements underneath +1Javascript(动态)插入数组,然后将所有元素移到+1下
【发布时间】:2013-12-26 10:50:38
【问题描述】:

并没有真正找到针对 Javascript 的解决方案。 我需要的;我想将一个元素插入到数组中,但并没有真正覆盖该元素。而是“动态”插入。因此插入元素,然后将其下方的所有元素移动 +1 索引。

例如:

I have an array "14S" "16S" "19S".
I know want to insert "15S".
The resulting array: "14S" "15S" "16S" "19S"

我尝试了什么:

  fullName = "15S"
  low = 5;
  cardsS[low] = fullName;
  for (var i = low; i < cardsS.length; i++) {
      cardsS[i + 1] = cardsS[i];
  }

【问题讨论】:

  • 为什么不 push() 而不是 sort() 数组?你对插入有什么要求?如何选择索引?

标签: javascript html arrays


【解决方案1】:

你只需要使用push()然后sort()函数:

var yourArray = ['14S', '16S', '19S'];

yourArray.push('15S');
yourArray.sort();

【讨论】:

  • 似乎合乎逻辑:D 与拼接有什么区别?
  • @PHPnooblet 你怎么知道要拼接?此外,在比较元素时做一个好的 ole' 循环也可以。
  • 排序并没有真正起作用,只是测试了一下。元素也是“14 S”(中间有空格)。也许这很重要?
  • 刚刚尝试直接进入 Chrome 控制台,即使我添加了像“14 S”这样的元素,排序似乎也能正常工作。
【解决方案2】:

如果您知道要将元素插入的位置:

使用splice 方法。它很便宜,而且完全符合您的要求。您也可以一次插入多个元素:

var strings = ["14S", "16S", "19S"];
strings.splice(1,0,"15S");

结果

"14S" "15S" "16S" "19S"

如果您不希望以特定方式对数组进行排序,也应该使用此解决方案。

如果您不知道要将元素插入的位置:

您将不得不求助于push/sort 组合,提供您自己的排序算法(除非标准排序就足够了)

var strings = ["14S", "16S", "19S"];
strings.push("15S");
strings.sort(function(a, b){
    if (a is less than b by some ordering criterion)
        return -1;
    if (a is greater than b by the ordering criterion)
        return 1;
    // a must be equal to b
    return 0;
});

【讨论】:

  • 拼接和推送/排序有什么区别?
  • 两者都有效,但我相信splice 更快,因为它不必运行昂贵的排序算法。此外,如果您不希望对数组进行排序,push/sort 方法将不起作用。
  • 然而,ZenMaster 在对 Marc 回答的评论中说,您必须知道要在哪里插入元素。这取决于您要解决的问题。
【解决方案3】:

试试这个:

fullName ="15S"
cardsS = ["14S", "16S", "19S"];
for (var k in cardsS)
{
    if(parseInt(fullName) < parseInt(cardsS[k])){
        cardsS.splice(k,0,fullName)
        break;
    }
}

:)

如果你认为更好:

fullName ="15S"
cardsS = ["14S", "16S", "19S"];
for (var k = 0; cardsS.length > k; k++)
{
    if(parseInt(fullName) < parseInt(cardsS[k])){
       cardsS.splice(k,0,fullName)
        break;
    }

}

【讨论】:

  • 把它变成一个普通的for,你就会拥有它。 for-in 并不是遍历数组的最佳方式。
【解决方案4】:

你想要Array.splice

这会在位置 1 处拼接一个新元素。

arr.splice(1, 0, '155');

Fiddle

【讨论】:

  • 为什么是splice?不会是push吗?
  • OP 说“因此插入元素,然后将其下方的所有元素移动 +1 索引。” Splice 就是你这样做的方式。
  • 我知道,但您假设您知道索引。我觉得 OP 没有……或者这是一个非常奇怪的问题。
  • OP 表示他希望它在那个位置。我假设他知道索引。
  • 是的,我知道指数,我给了低 = 5
【解决方案5】:

你想要的是原生数组对象上的 splice 函数。

var arr = [];
 arr[0] = "14S";
 arr[1] = "16S";
 arr[2] = "19S";

 arr.splice(2, 0, "15S");
 console.log(arr.join());

The resulting array: 14S, 16S, 15S, 19S

【讨论】:

    【解决方案6】:

    如果您这样做,您将从cardS[5] 开始,其值为“fullName”。 事实是你的cardS为4个值,所以你的数组是0到3。你可以看到你的第4位的数组是unbind的。

    另外,如果你做cardS[i + 1],你会在位置6,这也是unbind。

    你要做的是:

    1. 检查数组中有多少项(长​​度、计数)
    2. 使用 Lenght + 1 创建一个新数组
    3. 检查您的新项目是 > 还是 ,你必须添加你的第一个项目,如果不是,你必须添加你的新项目
    4. 执行此操作,直到您的阵列已满。

    如果你不想那样做,你可以使用 Splice 函数,只是检查它,或者使用 javascript 库中的排序函数。

    希望对你有帮助!

    【讨论】:

      【解决方案7】:

      您可以使用Array.splice 插入一个值:

      var arr = ["14S","16S","19S"];
      arr.splice(1,0,"15S");
      //         ^position after which to insert
      //            ^number of elements to delete (none here)
      //              ^value to insert ("15S" here)
      // => arr is now ["14S","15S","16S","19S"]
      

      如果不知道位置,可以使用Array.indexOf来确定:

      var arr = ["14S","16S","19S"];
      arr.splice((arr.indexOf('14S')>-1 && arr.indexOf(after)+1 || 0),0,"15S");
      //         ^use indexOf result if applicable or just insert 
      //          (so, if no position, this turns into unshift ;)
      

      你可以为它创建一个方法:

      function arrayInsertAfter(array, after, value){
        after = array.indexOf(after)>-1 && array.indexOf('14S')+1 || 0;
        array.splice(after, 0, value);
        return array;
      }
      // usage
      var arr = arrayInsertAfter(["14S","16S","19S"],"14S","15S");
      // => ["14S","15S","16S","19S"]
      

      MDN link for Array.splice

      【讨论】:

        【解决方案8】:

        在您的一个 cmets 中,您询问了 splice 方法和 push+sort 方法之间的区别。

        Splice 只是分割你的数组并根据索引插入/删除值。 使用上面提到的例子:

        var strings = ["14S", "16S", "19S"];
        strings.splice(1,0,"15S");
        

        这实际上会将“15S”放在索引 1 上。这就是为什么会有注释“如果您不知道要将元素插入到的位置:”

        在这种情况下,push+sort 方法就派上用场了。此时,您不必计算元素并确保将所有内容放置在正确的位置。 实际上,您只需将“15S”推到数组的末尾,然后让 sort() 自动为您排序所有内容。

        这意味着您的数组确实是可排序的。有些设置并不能真正让你对数组进行排序(就像彩虹中按颜色排序的颜色......你不能只使用 sort() 对它们进行排序)。

        在这种情况下,KooiInc 的反应开始发挥作用。在这一点上,您知道您的项目需要放在哪里。 15S 在 14S 之后,所以你搜索 14S,得到那个索引,然后用那个索引来拼接。 在这一点上,您仍然需要自己计算 15S 必须使用的元素 - 在我的彩虹示例中,您必须根据此时数组中的颜色主动记住要“插入”哪种颜色的位置。

        在您的示例中,这些值似乎适合正常排序,所以我会采用一些人提到的 Push+sort 方法。

        【讨论】:

          【解决方案9】:
          var arr = [1,2,4,5,6];
          var element = 3, pos=3;
          
          for(i=arr.length-1; i>=pos-1; i--){
              arr[i+1]=arr[i];
          }
          arr[pos-1]=element;
          console.log(arr);
          

          【讨论】:

          • 如果你能解释一下就好了
          猜你喜欢
          • 2021-12-04
          • 2022-12-22
          • 2016-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-15
          • 1970-01-01
          相关资源
          最近更新 更多