从数组中删除元素,使用切片还是splice更好?

3

由于数据量较大,我设置了数组$scope.event的大小限制,因此当它达到BufferLimit时,从数组中删除第一个项目并将最新项目添加到数组中。在删除或添加项时,使用slicesplice哪种方法更好?

Ctrl.js

$scope.event = [];
    function safelyAdd(element) {
        if (totalReceived > Bufferlimit && $scope.event.length) {

            $scope.event = $scope.event.slice(1); //delete first element in $scope.event

            totalReceived -= $scope.event[0].messageSize; //total message size minus deleted message size
            console.log('totalReceivedBytes', totalReceived);
            // $scope.event =[];//reset array if max size reached..
            console.log('$scope.event', $scope.event)
        }
        console.log('$scope.event.length', $scope.event.length);

            $scope.event.push(element); //then push new item..

    }

这在很大程度上(如果不是完全)基于个人意见;我想值得注意的是,slice()返回一个新的数组,而splice()则直接修改原数组,并返回被移除元素组成的数组:https://jsfiddle.net/4hs0Lvy6/ 请注意,这种选择似乎最多只能算是微小的优化,因此最好的方法几乎肯定是保持与您或您团队通常的编程实践一致。 - David Thomas
Splice 更加提高了性能,但不是纯函数,因为它会改变原始数据。 - anoop
是的,我有性能问题。我们每分钟收到将近10,000条信息,那么在这种情况下有什么更好的解决方法呢? - hussain
我先尝试了切片,但是在缓冲限制处导致浏览器崩溃。从性能方面来看,splice 看起来不错。 - hussain
除了使用切片或者拼接,我还能采用更好的方法吗? - hussain
显示剩余2条评论
3个回答

2

这完全取决于您的需求:

  1. splice() 方法返回数组中被移除的项,而 slice() 方法则返回所选元素作为新数组对象。
  2. splice() 方法会改变原始数组,而 slice() 方法不会改变原始数组。
  3. 您可以在使用 splice() 时插入数组项,但是 slice() 只能移除数组项。

我该如何从数组中完全删除项目?我看到slicesplice都会返回一些东西,我们正在讨论大量数据,假设每分钟有1000条消息。在这种情况下,你认为哪个更好? - hussain
我在使用切片时发现浏览器因为频繁切片和添加新项而在BufferLimit处冻结了。 - hussain
你试过用splice()吗?你可以使用它,但它会改变原始数组。 - Mamun
splice() 会改变它们所实现的数组,即对数组进行了变异。 - Mamun
可以的,这是使用splice()的优势之一。 - Mamun
显示剩余9条评论

0

我建议使用splice,因为它会改变你正在使用的数组,而slice不会改变数组-它会创建一个新的数组。

速度等方面的差异很可能对用户来说是看不见的(除非差距很大),在这种情况下,splice会更有用。

$scope.event.splice(0, 1);

更多信息请查看此处;

链接


0
这取决于你的需求。在angularJs中,我们总是使用数据绑定,因此最好使用splice,这样UI会立即反映出来。但是,如果您使用slice,它会返回一个新数组,然后需要将其放入作用域数组中才能在UI中反映出来。如果使用angularjs并且没有依赖于相同的数组,我建议使用splice。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接