2016-04-14 21 views
4

オブジェクトを含む2つの配列があります。 1つはキーをいくつかの順序で含み、もう1つはデータを持ち、ソートされたキー配列に対してデータ配列をソートする必要があります。これどうやってするの?別のキー配列に基づいてオブジェクト配列をソート

var a = ['d','a','b','c'] ; 
var b = [{a:1},{c:3},{d:4},{b:2}]; 

結果は次のようになります

result = [{d:4},{a:1},{b:2},{c:3] 
+0

。これに関することはJSONとは関係ありません。私はそのように編集しました。 –

答えて

6

この

var a = ['d','a','b','c'] ; 
 
var b = [{a:1},{c:3},{d:4},{b:2}]; 
 

 
b.sort(function(x,y){ 
 
    var xkey = a.indexOf(Object.keys(x)[0]); 
 
    var ykey = a.indexOf(Object.keys(y)[0]); 
 
    return xkey - ykey; 
 
}) 
 

 
document.body.innerHTML += JSON.stringify(b,0,4);

+0

魅力のような作品です! –

0

ブルートフォース手法を試しアレイのそれぞれをループにあり、bアレイを確認それの存在のために。

var a = ['d','a','b','c'] ; 
 
var b = [{a:1},{c:3},{d:4},{b:2}]; 
 

 
var ans = []; 
 

 
for(var i = 0; i < a.length; ++i) 
 
{ 
 
for(var j = 0; j < b.length; ++j) 
 
{ 
 
    if(b[j][a[i]]) 
 
    ans.push(b[j]); 
 
} 
 
} 
 
document.write(JSON.stringify(ans, 0, 4));

0

これは、上記のものとは異なるアプローチがLodash JavaScriptライブラリを使用して、なりトリック

result = a.map(function(key) { 
    for(var i=0; i<b.length; ++i) { 
     if(key in b[i]) return b[i]; 
    } 
}); 
4

を行う必要があります。

var a = ['d','a','b','c'] ; 
 
var b = [{a:1},{c:3},{d:4},{b:2}]; 
 

 
var results = _.map(a,function(av) { 
 
    var obj = {}; 
 
    obj[av] = _.find(b, av)[av]; 
 
    return obj 
 
}); 
 

 
document.body.innerHTML += JSON.stringify(results);
<script src="https://cdn.jsdelivr.net/lodash/4.11.1/lodash.min.js"></script>

0

このアプローチは、ソートの配列のオブジェクト内のキーを尊重します。

aの項目のみが検索およびそれぞれの注文に使用されます。この場合

dはインデックスでソートしながらそうd

[ 1, 3, 0, 2 ] 

のように見える、bの項目のすべてのソート値を取得し、我々は単にb

のインデックスを持っている eを、必要とします
[ 0, 1, 2, 3 ] 

ソート後は

[ 2, 0, 3, 1 ] 

希望のソート順。これで元の配列が新しい順序に再マップされます。

なぜですか?

通常、オブジェクトには複数のプロパティが含まれています。 Object.keysを使用して最初の要素だけを使用すると、この要素はソート順を取得するための要素ではないため、間違ってしまう可能性があります。

これを保存するには、の固定項目と組み合わせてArray#indexOfを使用しない別の方法が必要です。ただ、FYI

var a = ['d', 'a', 'b', 'c'], 
 
    b = [{ a: 1 }, { c: 3 }, { d: 4 }, { b: 2 }], 
 
    d = b.map(function (bb) { 
 
     var k = -1; 
 
     a.some(function (aa, i) { 
 
      if (aa in bb) { 
 
       k = i; 
 
       return true; 
 
      } 
 
     }); 
 
     return k; 
 
    }), 
 
    e = b.map(function (_, i) { return i; }); 
 

 
e.sort(function (a, b) { 
 
    return d[a] - d[b]; 
 
}); 
 

 
b = e.map(function (a) { 
 
    return b[a]; 
 
}); 
 

 
document.write('<pre> ' + JSON.stringify(b, 0, 4) + '</pre>');

関連する問題