Javascriptで連想配列と通常の配列の違いを取得することは可能ですか?
元。
array1 = [5, 1, 3];
array2 = [1 => 15, 2 => 20, 3 => 10, 4 => 5, 5 =>50 ];
違いは...
diff = [2 => 20, 4=> 5];
Javascriptで連想配列と通常の配列の違いを取得することは可能ですか?
元。
array1 = [5, 1, 3];
array2 = [1 => 15, 2 => 20, 3 => 10, 4 => 5, 5 =>50 ];
違いは...
diff = [2 => 20, 4=> 5];
私はあなたの質問があなたの宣言に小さなタイプミスを持っていたと思います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の慣用句として受け入れられています。indexOf
array1
+
補遺
RobGが指摘しているように、indexOf
はES5メソッドであるため、JavaScriptエンジンがES3以下の場合はindexOf
、独自に実装する必要があります。 これを行う方法の例は、MDNにあります。indexOf
または、自分で配列を検索することで、同等のことを行うことができます。
</ p>
まず第一に、最初の 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);
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).