使用另一个阵列更新阵列(删除并添加值)

时间:2013-01-17 17:22:32

标签: javascript arrays merge sorting

在javascript中我有两个数组,他们在聊天室中有在线用户列表。必须使用新值更新具有旧值的第一个数组。

var array1 = array(1,5,50,4,12,3,60);

var array2 = array(12,1,5,4,3,60);

array1在用户界面上,所以我不想用array2替换它。首先,我想从array1中删除不在array2中的值,然后在array1的开头从array2添加新值。

我还应该提到,那种数组2很重要,数组的数量也可能不同。数组的数量可以是100,它可以每5-10秒更新一次!

例如,您可以在Stackoverflow聊天服务http://chat.stackoverflow.com/rooms/17/javascript

上查看在线用户列表

这是我开发它的第一种方式,我能做得更好吗?

删除旧值

for(i=0;i<array1.length;i++)
    if(array2.indexOf(array1[i])==-1)
        removeValue(array1[i]);

用于添加新值

for(i=0;i<array2.length;i++)
    if(array1.indexOf(array2[i])==-1)
        addValue(array2[i]);

您对更新第一个数组有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您的两个功能都存在语法错误。而不是array2.indexOf(array1[i]==-1)它应该是array2.indexOf(array1[i])==-1

要更新阵列,可以使用阵列的unshift(前置)和splice方法。但是,当您从数组中删除项目时,其长度会发生变化,这会影响您的循环条件 - 更好地向后迭代。

答案 1 :(得分:0)

不确定我是否理解正确但这是你需要的吗?你想通过保持旧元素位置尽可能固定,并在左边插入新元素来更新和数组吗?

在此尝试:http://jsfiddle.net/Rt5Mx/

...

如果您需要在右侧添加新元素,只需更改为

      return array3.concat(array2);

并且如果需要反向排序可以使用array2.reverse()(但是你可以更好地考虑在生成array2时/更改其方向)。

<强>更新

保持旧array2完整的版本:左右合并:

http://jsfiddle.net/Rt5Mx/2/

  var array1 = [1,5,50,4,12,3,60];
  var array2 = [12,1,5,4,43,3,60];


  alert(mySpecialMergeLeft(array1,array2));
  // 43,1,5,4,12,3,60
  // same as old array1 with added 43 at left and removed 50

  alert(mySpecialMergeRight(array1,array2));
  // 1,5,4,12,3,60,43
  // same as old array1 with added 43 at right and removed 50

  function mySpecialMergeLeft(array1,array2) {
      var pos;
      var array3=[];
      var array4=array2.slice();
      for(var i=0;i<array1.length;i++) {
          pos=array4.indexOf(array1[i]);
        if(pos!=-1) {
          array3.push(array1[i]);
          array4.splice(pos,1);
        }
      }
      return array4.concat(array3);
  }

  function mySpecialMergeRight(array1,array2) {
      var pos;
      var array3=[];
      var array4=array2.slice();
      for(var i=0;i<array1.length;i++) {
          pos=array4.indexOf(array1[i]);
        if(pos!=-1) {
          array3.push(array1[i]);
          array4.splice(pos,1);
        }
      }
      return array3.concat(array4);
  }

答案 2 :(得分:0)

这是我的解决方法。

首先,我一直使用lodash的{​​{3}} API来节省时间。

例如: 我有一个包含值1、2、3的旧数组,以及一个包含2、4的新数组。 因此,我需要删除 1、3和添加 4到旧数组中。

const _ = require('lodash');    

const oldArr = [1, 2, 3];
const newArr = [2, 4];

const willRemove = _.difference(oldArr, newArr);
const willAdd = _.difference(newArr, oldArr);

console.log('Remove', willRemove); // [1, 3]
console.log('Add', willAdd); // [4]

下一步就是你了。