2017-11-23 12 views
0

ランダムに配置された値を1つのarrayにソートして別の配列によって提供されるorderと一致するようにする方法ですが、重複を1つずつ追加する代わりに、関数はorder変数もう片方。配列内の値を、別の配列で指定された順序で並べ替えますか?

入力:

const array = [1, 5, 4, 3, 5, 3, 1, 5, 4]; 
const order = [5, 1, 3, 4]; 

正しい出力:

const correctlyOrderedArray = [5, 1, 3, 4, 5, 1, 3, 4, 5]; 

間違った出力:

const wronglyOrderedArray = [5, 5, 5, 1, 1, 3, 3, 4, 4]; 
+1

あなたは何を試しましたか? – Li357

+1

その正確な出力*が何であるか不明確です –

+1

有効な入力が何であるかは同じですか? –

答えて

0

2つの関数。最初のものは実際の並べ替えを行い、2番目のものはそれ自体の中で使います。

主な機能:

function sortByOrder (array, order) { 

    const arrayOfArrays = order.map(v => { 

     return [...Array(howMany(v, array))].map(undef => v); 
    }); 

    const tempArray = []; 

    arrayOfArrays.forEach((subArr, i) => { 

     let index = order.indexOf(order[i]); 

     subArr.forEach(duplicate => { 

      tempArray[index] = duplicate; 

      index += order.length; 
     }); 
    }); 

    return tempArray.filter(v => v); 
} 

下位機能:

function howMany(value, array) { 

    const regExp = new RegExp(value, 'g'); 

    return (array.join(' ').match(regExp) || []).length; 
} 
+1

この投稿をあなたの質問に追加してみてください。 – edkeveked

+1

編集を使用してくださいリンクをクリックして追加情報を追加してください。回答を投稿するボタンは、質問に対する完全な回答のためだけに使用してください。 - [レビューの投稿](/レビュー/低品質の投稿/ 18046830) – alptugd

0

我々は、配列orderは、達成するための一つの方法を、アレイarrayのすべての非重複の要素が含まれているとした場合並べ替えは、モジュロを使用して注文の要素をコピーすることができるので、最初からコピーを再開することができます。

const array = [1, 5, 4, 3, 5, 3, 1, 5, 4]; 
 
const order = [5, 1, 3, 4]; 
 

 
var newValue = [] 
 
for(var i = 0; i < array.length; i++){ 
 
newValue.push(order[i % order.length]) 
 
} 
 

 
console.log(newValue)

0

私たちは、順番を反復し、その空になるまで私たちの配列から要素をシフトアウトできます

const array = [1, 5, 4, 3, 5, 3, 1, 5, 4]; 
const order = [5, 1, 3, 4]; 

let i = 0, exit = false; 
const result = []; 

while(array.length){ 
    const found = array.findIndex(el => el === order[i % order.length]); 
    if(found+1){ 
    result.push(array.splice(found, 1)[0]); 
    exit = false; 
    }  
    if(i && i % order.length){ 
    if(exit){ 
     result.push(...array); //concat the rest 
     break; 
    } 
    exit = true; 
    } 
    i++; 
} 

1回のオーダーの反復がなかった場合、終了ブール値は、プログラムを終了します何も見つかりません。例:

const order = [1,2,3], array = [4,5,6,1,2,3,1,2,3]; 

Let it run!

関連する問題