javascript数组取消一些元素

时间:2014-11-17 08:11:30

标签: javascript arrays splice

我有两个数组。第一个数组包含一些值,而第二个数组包含一些应插入第一个数组的元素。例如:

var aArr = [ {'a':111}, {'b':222}, {'c':333} ... ]
var bArr = [ {'x': 0}, {'y': 0} ] // I'm not sure it's length 

// finail I need got something like 
var aArr = [{'x': 0}, {'y': 0}, {'c':333} ...]

和bArr数组不确定它的长度,也许它有一个元素

var aArr = [ {'a':111}, {'b':222}, {'c':333} ... ]
var bArr = [ {'x': 0} ] 

// finail I need got something like 
var aArr = [{'x': 0}, {'b': 222}, {'c':333} ...]

我使用splice()效果不佳

var a = [1, 2, 3],
    b = [4, 5];

function prependArray(a, b) {

    a.splice(0, b.length, b);
    return a;
}

var result = prependArray(a, b);
// result =  [[4, 5], 3]  not  [ 4, 5, 3]

我该怎么办? ? 我需要更有效的方法,因为aArr有超过3000个值,而bArr有超过100个值。

感谢。

6 个答案:

答案 0 :(得分:4)

有很多方法可以做到这一点,但没有多少方法可以保留原始aArr引用(例如,修改实际的aArr数组而不创建新的aArr数组)。这是一种方式:

aArr.splice(0, bArr.length);            // remove front-most bArr.length items from aArr
aArr.unshift.apply(aArr, bArr);         // insert bArr items in front of aArr

这会删除bArr.lengthaArr项,然后将bArr项添加到aArr的前面,同时保留原始aArr引用(例如,不用新数组替换它)。


它也可以在一个.splice()中完成,但这需要构建一个临时数组传递给.splice.apply(),这似乎不值得,因为它创建一个全新的数组只是为了节省一行代码。无论如何,这看起来像这样:

aArr.splice.apply(aArr, [0, bArr.length].concat(bArr));

如果你真的想要最高效率"在性能而不是代码行方面,您可能需要使用jsperf等工具在多个浏览器中进行性能基准测试。可能只是简单地将bArr项目复制到arr中是最有效的"因为它具有最少的阵列操作。要确切知道,您必须在多个浏览器中测量典型阵列大小的实际性能。

对于纯粹的表现,你应该测试这个与上面的选项:

for (var i = 0, len = bArr.length; i < len; i++) {
    aArr[i] = bArr[i];
}

这样做的好处是它不会创建任何临时数组,也不必转移aArr周围的项目。它的缺点是在普通的javascript中运行循环,而不是在本机数组操作代码中运行。


似乎只复制元素的最后一个选项在Chrome中快7倍,在IE11中快10倍,在Firefox中差异更大。

请在此处查看jsperf:http://jsperf.com/array-shift-vs-copy

enter image description here

答案 1 :(得分:1)

function prependArray(a, b) {
    return a.splice.apply(a, [0, b.length].concat(b))
}

感谢顺磁性羊角面包(* _ *)

答案 2 :(得分:0)

Javascript中有一个concat-Method:

result = b.concat(a);

编辑:忘记删除以下内容中的旧值:

连续后,应用拼接:

result.splice(b.length, b.length);

工作示例:http://jsfiddle.net/9sLjnu66/

答案 3 :(得分:0)

var aArr = [{
  'a': 111
}, {
  'b': 222
}, {
  'c': 333
}]
var bArr = [{
    'x': 0
  }, {
    'y': 0
  }] // I'm not sure it's length 

for (var i = 0; i < bArr.length; i++) {
  if (i > aArr.length) break;
  aArr[i] = bArr[i];
}

//show the results
document.write(JSON.stringify(aArr));
The result should be:
<br>
<code>
  [{'x': 0}, {'y': 0}, {'c':333}]
</code>
<br>And it is:
<br>

答案 4 :(得分:0)

在ECMAScript 6中:

a.splice(0, b.length, ...b);

答案 5 :(得分:0)

另一个想法是

bArr.concat(aArr.slice(bArr.length))

换句话说,切掉第一个数组的前n个元素,其中n是第二个数组的长度,然后将其附加到第二个数组。