2017-09-18 15 views
2

に基づくものをソートする必要がある私は、この2つのオブジェクトの配列や他の

var array1 = [ 
    { 
    "key": 0, 
    "display": "hide", 
    }, 
    { 
    "key": 1, 
    "display": "show", 
    }, 
    { 
    "key": 2, 
    "display": "show", 
    }, 
] 

var array2 = [ 
{ 
    "key": 1, 
    "question": "some text here", 
}, 
{ 
    "key": 0, 
    "question": "Different text here", 
}, 
{ 
    "key": 2, 
    "question": "Even more different", 
}, 
] 

のような2つのオブジェクトの配列を持っている私は更新しない、配列2内のキーの順序と一致するように並べ替えられるために配列1を必要とします

:私は配列1をもたらすことが期待されるだろうと配列2のキーの順序と一致するように配列1を並べ替えた後、例えば、(そのオブジェクト全体の順序を変更/移動)

を順序と一致するが、表示値を更新する必要がありますキー

[ 
{ 
    "key": 1, 
    "display": "show", 
}, 
{ 
    "key": 0, 
    "display": "hide", 
}, 
{ 
    "key": 2, 
    "display": "show", 
} 
] 

私はそれがおそらくsort関数を使って行われていることを知っていますが、私はこの場合どのように動作するかを理解するのに苦労しています。

答えて

2

次の方法でこれを達成することができる: `

var array1 = [ { "key": 0, "display": "hide", }, { "key": 1, "display": "show", }, { "key": 2, "display": "show", }]; 
 
var array2 = [ { "key": 1, "question": "some text here", }, { "key": 0, "question": "Different text here", }, { "key": 2, "question": "Even more different", }]; 
 

 
var keys = array2.map(el => el.key); 
 
array1.sort((a, b) => keys.indexOf(a.key) - keys.indexOf(b.key)); 
 
console.log(array1);

+1

シンプルで効率的。あなたが本当にしなければならない限り、ハッシュマップを使っていないでください。 – georg

1

私はおそらくコメントを参照して、第二のソート時にそのマップを使用して、その後、最初の配列のインデックスにキーのマップを構築することにより、それに近づきたい:

var array1 = [ { "key": 0, "display": "hide", }, { "key": 1, "display": "show", }, { "key": 2, "display": "show", },] 
 

 
var array2 = [ { "key": 1, "question": "some text here", }, { "key": 0, "question": "Different text here", }, { "key": 2, "question": "Even more different", },] 
 

 
// Build the map of key->index from the first array 
 
var map = Object.create(null); 
 
array1.forEach(function(entry, index) { 
 
    map[entry.key] = index; 
 
}); 
 
// Sort the second array using the key->index map 
 
// map[left.key] - map[right.key] returns a number less than 0 
 
// if the left should be before the right, 0 if they're the 
 
// the same (they won't be, as these are indexes from the 
 
// first array), or greater than zero if the left should be 
 
// after the right 
 
array2.sort(function(left, right) { 
 
    return map[left.key] - map[right.key]; 
 
}); 
 
console.log(array2);
.as-console-wrapper { 
 
    max-height: 100% !important; 
 
}

+0

'の代わりに '{}の' Object.create(null)を使用して任意の利点、または'new Object()'? – Rayon

+1

@Rayon:引用されたデータのキーは、一般に、オブジェクトをマップとして使用する場合は、 'Object.prototype'のプロパティが表示されないようにすると便利です。したがって、' Object.create(null) 'を使用してオブジェクトを作成しないでくださいプロトタイプ(したがって、既存の継承されたプロパティはありません)。しかし、上では問題ではありません。 'map = {};'はうまくいくでしょう。 –

+1

私は、ロジックに重点が置かれるように、データをミニバージョンに置き換えました。編集が必要ないと思うなら、それを元に戻してください。 – Rajesh

2

あなたはインデックス値を保持し、それに基づいて配列をソートすることができるhashMapを作成できます。

var array1 = [ { "key": 0, "display": "hide", }, { "key": 1, "display": "show", }, { "key": 2, "display": "show", },] 
 

 
var array2 = [ { "key": 1, "question": "some text here", }, { "key": 0, "question": "Different text here", }, { "key": 2, "question": "Even more different", },] 
 

 
var array2Hash = array2.reduce(function(p,c,i){ 
 
    p[c.key] = i; 
 
    return p; 
 
}, Object.create(null)) 
 

 
array1.sort(function(a,b){ 
 
    return array2Hash[a.key] - array2Hash[b.key]; 
 
}); 
 

 
console.log(array1);

関連する問題