2017-12-20 10 views
-1

基本的に私の質問はタイトルです。私はオブジェクトの2つの配列を持っています。Javascriptアンダースコアを使用して別の配列順に基づいて配列順序をソート

アレイ1:

var firstArray = [ 
{id: "1", value: 1}, 
{id: "5", value: 0.5}, 
{id: "3", value: 0.25}, 
{id: "4", value: 0.125}, 
{id: "2", value: 0.0625} 
]; 

アレイ2:順序は、このような最初の配列順序と一致するように

var secondArray = [ 
{id: 1, name: "a"}, 
{id: 2, name: "b"}, 
{id: 3, name: "c"}, 
{id: 4, name: "d"}, 
{id: 5, name: "e"} 
]; 

どのように私は私の二番目の配列をソートすることができます。

結果:

012平野ES6で
var secondArray = [ 
{id: 1, name: "a"}, 
{id: 5, name: "e"}, 
{id: 3, name: "c"}, 
{id: 4, name: "d"}, 
{id: 2, name: "b"} 
]; 
+1

関係の代替手段を示唆しますか? – naomik

答えて

2

アンダースコア/ロダッシュの回答を与えるのは、質問のタイトルがOPの後にあることを示しているからです。このコードは、2番目の配列を、最初の配列の対応するidのインデックスでソートします。

$(function() { 
 
    var firstArray = [ 
 
\t {id: "1", value: 1}, 
 
\t {id: "5", value: 0.5}, 
 
\t {id: "3", value: 0.25}, 
 
\t {id: "4", value: 0.125}, 
 
\t {id: "2", value: 0.0625} 
 
    ]; 
 
    var secondArray = [ 
 
\t {id: 1, name: "a"}, 
 
\t {id: 2, name: "b"}, 
 
\t {id: 3, name: "c"}, 
 
\t {id: 4, name: "d"}, 
 
\t {id: 5, name: "e"} 
 
    ]; 
 

 
    var sorted = _.sortBy(secondArray, function(obj) { 
 
\t return _.findIndex(firstArray, {id: obj.id.toString()}); 
 
    }); 
 

 
    console.log(sorted); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

は同じ配列を返しますがソートされません。 – hxdef

2

、あなたが与えられたidのインデックスにMapを取り、firstArrayの指標でそれを並べ替えることができます。

問題は、指定された配列に異なるタイプのidがあります。

var firstArray = [{ id: "1", value: 1 }, { id: "5", value: 0.5 }, { id: "3", value: 0.25 }, { id: "4", value: 0.125 }, { id: "2", value: 0.0625 }], 
 
    secondArray = [{ id: 1, name: "a" }, { id: 2, name: "b" }, { id: 3, name: "c" }, { id: 4, name: "d" }, { id: 5, name: "e" }], 
 
    map = new Map(firstArray.map(({ id }, i) => [+id, i])); 
 

 
secondArray.sort((a, b) => map.get(a.id) - map.get(b.id)); 
 

 
console.log(secondArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

注目するいくつかのキャスト(1つの配列のid文字列は、一つは番号です)、あなたはと.find()(ニーナさんMap異なる)ES6 .map()でこれを行うことができます。

var firstArray = [ 
 
    {id: "1", value: 1}, 
 
    {id: "5", value: 0.5}, 
 
    {id: "3", value: 0.25}, 
 
    {id: "4", value: 0.125}, 
 
    {id: "2", value: 0.0625} 
 
]; 
 

 
var secondArray = [ 
 
    {id: 1, name: "a"}, 
 
    {id: 2, name: "b"}, 
 
    {id: 3, name: "c"}, 
 
    {id: 4, name: "d"}, 
 
    {id: 5, name: "e"} 
 
]; 
 

 
var result = firstArray.map(item => { 
 
    return { 
 
    id: Number(item.id), 
 
    name: secondArray.find(element => element.id == item.id).name 
 
    } 
 
}) 
 

 
console.log(result)

+0

大変ありがとうございます:)完璧に動作します) – hxdef

1

XY problem?

私はあなたが二番目の配列がソートされた後に、インデックスによって二つの配列を関連する計画を持って感じます。あなたは二番目の配列をソートしたらやろうとしているもの:私はあなたが答えるために、より重要な質問を持って

const firstArray = 
 
    [ {id: "1", value: 1} 
 
    , {id: "5", value: 0.5} 
 
    , {id: "3", value: 0.25} 
 
    , {id: "4", value: 0.125} 
 
    , {id: "2", value: 0.0625} 
 
    ] 
 

 
const secondArray = 
 
    [ {id: 1, name: "a"} 
 
    , {id: 2, name: "b"} 
 
    , {id: 3, name: "c"} 
 
    , {id: 4, name: "d"} 
 
    , {id: 5, name: "e"} 
 
    ] 
 

 
const thirdArray = 
 
    firstArray.map (x => 
 
    Object.assign (x, secondArray.find (y => y.id == x.id))) 
 
    
 
console.log (thirdArray) 
 
// [ { id: 1, value: 1, name: 'a' } 
 
// , { id: 5, value: 0.5, name: 'e' } 
 
// , { id: 3, value: 0.25, name: 'c' } 
 
// , { id: 4, value: 0.125, name: 'd' } 
 
// , { id: 2, value: 0.0625, name: 'b' } 
 
// ]

関連する問題