3

Javascriptで連想配列と通常の配列の違いを取得することは可能ですか?

元。

array1 = [5, 1, 3];
array2 = [1 => 15, 2 => 20, 3 => 10, 4 => 5, 5 =>50 ];

違いは...

diff = [2 => 20, 4=> 5];
4

4 に答える 4

4

私はあなたの質問があなたの宣言に小さなタイプミスを持っていたと思いますarray2。これは大したことではありません。

とにかく、ここに少しハックがありますが、それはあなたが望むものをあなたに与えます:

array1 = [5, 1, 3];
array2 = {1: 15, 2: 20, 3: 10, 4: 5, 5: 50};

var result = {};
for (var i in array2) {
    if (array1.indexOf(+i) < 0) {
        result[i] = array2[i];
    }
}

alert(JSON.stringify(result));

実例

あなたの「連想配列」のプロパティは文字列ですが、あなたには数字が含まれているので、私のハックは呼び出しの+i中にあります。単項演算は、文字列から数値を生成します。一種のハックですが、JavaScriptの慣用句として受け入れられています。indexOfarray1+

補遺

RobGが指摘しているように、indexOfはES5メソッドであるため、JavaScriptエンジンがES3以下の場合はindexOf、独自に実装する必要があります。 これを行う方法の例は、MDNにあります。indexOfまたは、自分で配列を検索することで、同等のことを行うことができます。

</ p>

于 2012-07-09T00:33:09.417 に答える
3

まず第一に、最初の 2 人のコメント投稿者が言ったように、2 番目の配列はオブジェクトでなければならず、有効な JavaScript ではありません。ここにオブジェクト形式があります:

var object = { "1": 15, "2": 20, "3": 10, "4": 5, "5": 50 };

この関数は、目的の結果を達成します。

function findDiff(arr, obj)
{
    var tempObj = clone(obj);
    for (var i = 0; i < arr.length; i++)
    {
        var propId = arr[i];
        if (tempObj[propId] !== undefined)
            delete tempObj[propId];
    }
    return tempObj;
}

この関数は、が参照ではなく値によってclone確実objにコピーされるようにする という関数に依存しています。tempObjこれにより、渡されたオブジェクトが変更されるのを防ぎます。

function clone(obj){
    if(obj == null || typeof(obj) != 'object')
        return obj;

    var temp = obj.constructor(); // changed

    for(var key in obj)
        temp[key] = clone(obj[key]);
    return temp;
}

次のように呼び出します。

var array = [5, 1, 3];
var object = { "1": 15, "2": 20, "3": 10, "4": 5, "5": 50 };

var diff = findDiff(array, object);
于 2012-07-09T00:42:06.980 に答える
2

You will need to explain in detail what you expect the result of the operation to be.

One interpretation is to remove members from one array based on the values in another, so given:

array1 = [5, 1, 3];
array2 = [15, 20, 10, 5, 50 ];

You might have a function:

function diff(arr1, arr2) {
  // Copy arrays so don't affect originals
  var t1 = arr1.slice();
  var t2 = arr2.slice();

  // sort t1
  t1.sort();

  // Remove members of arr2 from highest indexes to lowest
  var i = t1.length;
  while (i--) {
    t2.splice(t1[i], 1);
  }
  return t2;
} 

 alert(diff(array1, array2));  // 15, 10, 50

Note that arrays are zero indexed and there is no 5th member in array2, so the removed values are 20 and 5 (i.e. members with index 1 and 3 respectively).

于 2012-07-09T02:50:49.053 に答える