1

在 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 聊天服务上的在线用户列表https://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]);

您对更新第一个数组有任何想法吗?

4

3 回答 3

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);
  }
于 2013-01-17T18:25:55.153 回答
0

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

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

于 2013-01-17T17:41:46.903 回答
0

这是我的解决方案。

首先,我一直在使用differenceapi oflodash来节省时间。

例如: 我有一个包含值 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]

下一步是你的。

于 2019-07-31T11:07:35.253 回答