Javascript(动态)插入数组,然后移动+1下面的所有元素

时间:2013-12-09 10:53:09

标签: javascript html arrays

没有真正为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];
  }

9 个答案:

答案 0 :(得分:16)

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

使用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;
});

答案 1 :(得分:4)

您可以使用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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

你想要Array.splice

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

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

Fiddle

答案 4 :(得分:2)

你想要的是原生数组对象上的 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

答案 5 :(得分:1)

如果你这样做,你将从cardsS [5]开始,其值为“fullName”。 事实是你的牌是4个值,所以你的数组是0到3.你可以看到你位置4的数组是未绑定的。

此外,如果你做了牌[[i + 1],那么你将处于第6位,这也是非约束力。

你要做的是:

  1. 检查阵列中有多少项目(长度,计数)
  2. 使用Lenght + 1
  3. 创建一个新数组
  4. 检查您的新商品是否为&gt;或者&lt;到你的第一个项目。如果是>,则必须添加您的第一个项目,否则您必须添加新项目
  5. 执行此操作直到阵列已满。
  6. 如果您不想这样做,您可以使用Splice功能,只需检查它,或使用javascript库中的排序功能。

    希望这可以帮到你!

答案 6 :(得分:0)

试试这个:

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;
    }

}

答案 7 :(得分:0)

在您的一条评论中,您询问了拼接方法和推送+排序方法之间的区别。

Splice只会切断您的数组并根据索引插入/删除值。 使用上面提到的例子:

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

这将把“15S”放在索引1上。这就是为什么有一句话“如果你不知道你想要将元素插入的位置:”

在这种情况下,推+排序方法发挥作用。此时,您无需计算元素数量并确保将所有内容放在正确的位置。 你只需要在数组末尾推送你的“15S”,然后让sort()自动为你排序。

这个,授予你的数组确实可以排序。有些设置实际上并不允许你对数组进行排序(就像在彩虹中按颜色排序的颜色......你不能只使用sort()对它们进行排序)。

在这种情况下,KooiInc的回应开始发挥作用。此时,您知道您的商品需要在哪里。 15S在14S之后出现,因此您搜索14S,获取该索引,并使用该索引进行拼接。 此时你还需要自己计算一下15S必须遵循的元素 - 在我的彩虹示例中,你必须主动记住你想要根据阵列中的颜色“插入”哪种颜色。

在你的例子中,这些值似乎适合于正常的排序,所以我会选择一些人提到的Push +排序方法。

答案 8 :(得分:0)

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);