2016-06-17 5 views
0

私は動的に生成されたJavaScript配列を 'マスター'配列に対してソートしようとしています。このマスター配列は、動的に生成された配列のソート方法のテンプレートとして使用されます。ただし、マスター配列には今後新しい項目が追加される可能性がありますが、そのような項目は手動で追加されます。別の配列をテンプレートとして使用して配列データをソートする方法は?

ソートする必要のある配列である:

var arrayToSort = ['ABCD','ABCD 123 Team','IMT_User_MNOP']; 

マスター配列は次のとおりです。

var roleDef = ['IMT_User_MNOP','IMT_User_User','ABCD','ABCD 123 Team','ABCD Plans']; 

私はSOでここにほぼすべてのソリューションを閲覧しない、とのいずれました一致しない数の項目を持ち、インデックス値===のインデックス値をソートすることに基づいて、別の配列に対して配列をソートします。他のソリューションでは、キーを扱うか、文字(または数字に基づく文字)に基づいて番号をソートします。

正しい方向に私を向けるだけであっても、これを把握してください。

+0

ソート対象配列の要素は、常にマスター配列のサブセットですか?次に、検索配列に対してマスター配列を実際にフィルタリングします。それでおしまい。 –

答えて

1

var arrayToSort = ['ABCD','ABCD 123 Team','IMT_User_MNOP']; 
 
var roleDef = ['IMT_User_MNOP','IMT_User_User','ABCD','ABCD 123 Team','ABCD Plans']; 
 

 

 
var newArr = arrayToSort.map(function(item){ 
 
    var idx = roleDef.indexOf(item); 
 
    
 
    return { 
 
    val:item, 
 
    roleDefIndex:idx 
 
    }; 
 
}); 
 
var result = newArr.sort(function(a, b) { 
 
    return a.roleDefIndex - b.roleDefIndex; 
 
}).map(function(item){ 
 
    return item.val; 
 
}); 
 
console.log(result);

他のバージョン

var arrayToSort = ['ABCD','ABCD 123 Team','IMT_User_MNOP']; 
 
var roleDef = ['IMT_User_MNOP','IMT_User_User','ABCD','ABCD 123 Team','ABCD Plans']; 
 

 
var IndexWithinRole = {}; 
 
arrayToSort.forEach(function(item){ 
 
    IndexWithinRole[item] = roleDef.indexOf(item); 
 
}); 
 
arrayToSort.sort(function(a, b) { 
 
    return IndexWithinRole[a] - IndexWithinRole[b]; 
 
}); 
 
console.log(arrayToSort);

+0

あなたのソリューションは私のアプリケーションではソートされません。私が得るのは、 'Final View List(Sorted):ABCD、ABCD 123 Team、IMT_User_MNOP'です。私は両方のソリューションを試しました。 – Pegues

+0

私は両方のソリューションのソート機能を更新しました –

+0

私は以前のコメントで述べたのと同じ並べ替えを取得します。あなたのコード出力は正しいですが、自分のコードを私の中に入れても同じ結果を得ません。 – Pegues

1

デフォルト値を使用して、必要な並べ替え順序のハッシュテーブルを使用することをお勧めします。定義されていない値は、開始または終了になるはずです。

{ 
    "IMT_User_MNOP": 1, 
    "IMT_User_User": 2, 
    "ABCD": 3, 
    "ABCD 123 Team": 4, 
    "ABCD Plans": 5 
} 

var arrayToSort = ['ABCD', 'ABCD 123 Team', 'IMT_User_MNOP'], 
 
    roleDef = ['IMT_User_MNOP', 'IMT_User_User', 'ABCD', 'ABCD 123 Team', 'ABCD Plans'], 
 
    roleObj = Object.create(null); 
 

 
roleDef.forEach(function (a, i) { roleObj[a] = i + 1; }); 
 

 
arrayToSort.sort(function (a, b) { 
 
    return (roleObj[a] || 0) - (roleObj[b] || 0); 
 
}); 
 

 
console.log(arrayToSort);

+0

残念ながら私はハッシュテーブルを使うことはできないと思います。配列 'roleDef'はすでにjsonファイル内にあり、他の人が管理しています。現時点でフォーマットを変更しようとしているのかどうかはわかりません。 – Pegues

0

は、私は単にこれをしなかったが、あなたが生成するArray.indexOf()にしようとしている場合、それは

var arrayToSort = ['ABCD','ABCD 123 Team','IMT_User_MNOP'], 
 
     roleDef = ['IMT_User_MNOP','IMT_User_User','ABCD','ABCD 123 Team','ABCD Plans']; 
 
arrayToSort.sort((a,b) => roleDef.indexOf(a) - roleDef.indexOf(b)); 
 
console.log(arrayToSort);

0

を愚かだかいないかどうかを確認する時間を持っていませんO(n²)解決策:

var roleDef = ['IMT_User_MNOP','IMT_User_User','ABCD','ABCD 123 Team','ABCD Plans']; 
 
var arrayToSort = ['ABCD','ABCD 123 Team','IMT_User_MNOP']; 
 

 
var sorted = roleDef.filter(role => arrayToSort.indexOf(role) >= 0); 
 

 
console.log(sorted);

あなたは大きな配列のためのより多くの性能が必要な場合は、@ NinaScholzの答えで行くとあなたのroleDefからハッシュマップを事前計算。

関連する問題