1

javascriptには、チャットルームのオンラインユーザーのリストがある2つの配列があります。古い値を持つ最初の配列は、新しい値で更新する必要があります。

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

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

array1はユーザーインターフェイス上にあるので、array2に置き換えたくありません。まず、array2にない値をarray1から削除してから、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 を使用しています。lodash

例: 値 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 に答える