質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

6回答

4822閲覧

配列の並べ替えおよび後ろに送る方法

退会済みユーザー

退会済みユーザー

総合スコア0

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2017/01/31 04:43

編集2017/02/01 07:15

###前提・実現したいこと
[1,2,3,4,5,6,7]
という配列があったとして、これを任意の数を起点として並べ替え、それに満たない数は後ろに送った配列に並べ替えたいのです。
※追記
この配列は原則 1 から始まる昇順の配列です。
起点となる数自体は必ず含まれています。
また、後ろに送る場合も最後尾以降に 1 から昇順でお願いします。

(例)
任意の数が 4 の場合は
[4,5,6,7,1,2,3]

for で順番に数字を比較して、少ない場合は後ろに同じものを push し、さらにその回数分、先頭から削除するという方法は思い浮かんだのですが、これ以外にスマートな方法があれば教えてください。
※ 処理が終わらないので length = 7 を前提として処理を抜けています。

言語は JavaScript(TypeScript)です。

###該当のソースコード

let element = [1,2,3,4,5,6,7]; let a = 4; let times = 0; for (let index = 0; index < element.length; index++) { if (index === 7) { return; } if (element[index] < a) { element.push(element[index]); times += 1; } } element.splice(0, times);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2017/02/01 04:53

もとの配列には昇順に数字が入っているという前提でいいのですか? また、軸となる数(例だと4)も必ず含まれているという前提でいいのですか?
退会済みユーザー

退会済みユーザー

2017/02/01 07:10

はい、原則 1 から始まる昇順の配列です。軸の数字も必ず含まれます。なお後ろに送る場合も昇順でお願いします。
guest

回答6

0

こんな感じでもよいかも

javascript

1<script> 2var element = [1,2,3,4,5,6,7]; 3var a = 4; 4var x=[]; 5var y=[]; 6var x=element.filter(function (val){return val >=a;}); 7var y=element.filter(function (val){return val < a;}); 8Array.prototype.push.apply(x, y); 9console.log(x); 10</script> 11

投稿2017/01/31 06:30

yambejp

総合スコア114837

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

javascript

1const pointSort = function(array, num) { 2 const preSort = (a, b) => a - b, 3 mainSort = (a, b) => { 4 if (a < num) { 5 if (b < num) { 6 return -1 7 } 8 return 1; 9 } 10 return a - b; 11 }; 12 return array.slice().sort(preSort).sort(mainSort); 13}; 14 15pointSort([4, 1, 2, 3, 5, 7, 6], 4); // [4, 5, 6, 7, 1, 2, 3] 16

行数は減りますが、sort+concat+filter×2と、メソッドの使用回数は増えます。

javascript

1const pointSort = function(array, num) { 2 const preSort = (a, b) => a - b, 3 overFilter = (v) => v >= num, 4 lessFilter = (v) => v < num, 5 arr = array.slice().sort(preSort); 6 return arr.filter(overFilter).concat(arr.filter(lessFilter)); 7}; 8 9pointSort([4, 1, 3, 2, 5, 7, 6], 4); // [4, 5, 6, 7, 1, 2, 3]

投稿2017/01/31 06:40

編集2017/01/31 14:42
yamato_hikawa

総合スコア2092

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

for 文

私としては for 文で十分と考えます。
一応、Array.prototype.reduce でも実装できますが…。

JavaScript

1function sample1 (inputArray, inputNumber) { 2 var matched = [], smaller = []; 3 4 for (var i = 0, len = inputArray.length, value; i < len; ++i) { 5 value = inputArray[i]; 6 value < inputNumber ? smaller.push(value) : matched.push(value); 7 } 8 9 return matched.concat(smaller); 10} 11 12console.log(sample1([1, 2, 3, 4, 5, 6, 7], 4)); // [4, 5, 6, 7, 1, 2, 3]

Array.prototype.reduce

一方の配列(smaller)をスコープ外に置けば Array.prototype.reduce でも実装可能です。

JavaScript

1function sample2 (inputArray, inputNumber) { 2 var matched = [], smaller = []; 3 4 return inputArray.reduce(function (matched, current) { 5 current < inputNumber ? smaller.push(current) : matched.push(current); 6 return matched; 7 }, []).concat(smaller); 8} 9 10console.log(sample2([1, 2, 3, 4, 5, 6, 7], 4)); // [4, 5, 6, 7, 1, 2, 3]

クロージャとGCの扱いが微妙なのでスコープを調節するとこのように。

JavaScript

1var sample3 = (function () { 2 function reduceCallbackfn (matched, current) { 3 current < this.inputNumber ? this.smaller.push(current) : matched.push(current); 4 return matched; 5 } 6 7 return function sample3 (inputArray, inputNumber) { 8 var smaller = []; 9 return inputArray.reduce(reduceCallbackfn.bind({smaller: smaller, inputNumber: inputNumber}), []).concat(smaller); 10 } 11}()); 12console.log(sample3([1, 2, 3, 4, 5, 6, 7], 4)); // [4, 5, 6, 7, 1, 2, 3]

Array.prototype.filter

Array.prototype.filter を「4以上」と「4未満」で2回呼び出す方法もあるのですが、そうする場合は配列を2回走査する事になるのでアルゴリズム上は無駄が生じます。
配列を一度だけ回すのが美しいと考えています。
一応、filter 処理の中でもう一つの配列を作る手がありますが、処理内容は Array.prototype.reduce と同じです。

JavaScript

1function sample3 (inputArray, inputNumber) { 2 var smaller = []; 3 4 return inputArray.filter(function (value) { 5 return value < inputNumber ? (smaller.push(value), false) : true; 6 }).concat(smaller); 7} 8console.log(sample3([1, 2, 3, 4, 5, 6, 7], 4)); // [4, 5, 6, 7, 1, 2, 3]

更新履歴

  • 2017/01/31 14:27 Array.prototype.reduce のコード追記
  • 2017/02/01 00:05 Array.prototype.filter のコード追記

Re: holism さん

投稿2017/01/31 05:12

編集2017/01/31 15:06
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

node

1$ node 2> a = [1,2,3,4,5,6,7] 3[ 1, 2, 3, 4, 5, 6, 7 ] 4> a.concat(a).slice(4, 4 + 7) 5[ 5, 6, 7, 1, 2, 3, 4 ] 6>

配列を連結してから、指定番目から元の配列の長さ文だけを切り取る という処理にしてみました。

指定する値は [0..元の配列の長さ - 1] の範囲に収める必要があるので、 % 演算も必要です。

投稿2017/01/31 14:47

編集2017/01/31 14:51
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これじゃダメ?w

js

1const threshold = 4; 2let arr = [...Array(11).keys()]; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 3let result = arr.filter(v => v >= threshold).concat(arr.filter(v => v < threshold))); 4console.log(result); 5// [4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3]

投稿2017/01/31 08:10

編集2017/01/31 08:15
turbgraphics200

総合スコア4267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

javascript

1src =[1,2,3,4,9,8,7,6,5,10] 2threshold = 4 3 4 5sorted = src.sort(function(a,b){return a-b;}) 6less = sorted.filter(function(e) { 7 return (e < threshold); 8}); 9result = sorted.slice(less.length, sorted.length).concat(less) 10 11 12console.log(result)

投稿2017/01/31 05:02

編集2017/01/31 07:10
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2017/01/31 07:07 編集

[1,2,3,4,9,8,7,6,5,10] を入力したところ、[3, 4, 5, 6, 7, 8, 9, 1, 2, 3] が出力されました。 sort()は文字列比較を基準とするので 1,10,2... のようにソートされます。 また、質問文を読む限りでは数列を小さい順でソートする機能は求めていないように読めましたが、どうでしょうか。
ozwk

2017/01/31 07:18

うっかりしてました。ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問