オブジェクトを含む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]
オブジェクトを含む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]
この
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);
魅力のような作品です! –
ブルートフォース手法を試しアレイのそれぞれをループにあり、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));
これは、上記のものとは異なるアプローチがLodash
JavaScriptライブラリを使用して、なりトリック
result = a.map(function(key) {
for(var i=0; i<b.length; ++i) {
if(key in b[i]) return b[i];
}
});
を行う必要があります。
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>
このアプローチは、ソートの配列のオブジェクト内のキーを尊重します。
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>');
。これに関することはJSONとは関係ありません。私はそのように編集しました。 –