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

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

ただいまの
回答率

90.51%

  • JavaScript

    16444questions

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

  • TypeScript

    345questions

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

  • ECMAScript

    120questions

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

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

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,357
退会済みユーザー

退会済みユーザー

前提・実現したいこと

[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);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yuba

    2017/02/01 13:53

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/02/01 16:10

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

    キャンセル

回答 6

+4

こんな感じでもよいかも

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

 for 文

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

function sample1 (inputArray, inputNumber) {
  var matched = [], smaller = [];

  for (var i = 0, len = inputArray.length, value; i < len; ++i) {
    value = inputArray[i];
    value < inputNumber ? smaller.push(value) : matched.push(value);
  }

  return matched.concat(smaller);
}

console.log(sample1([1, 2, 3, 4, 5, 6, 7], 4));  // [4, 5, 6, 7, 1, 2, 3]

 Array.prototype.reduce

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

function sample2 (inputArray, inputNumber) {
  var matched = [], smaller = [];

  return inputArray.reduce(function (matched, current) {
    current < inputNumber ? smaller.push(current) : matched.push(current);
    return matched;
  }, []).concat(smaller);
}

console.log(sample2([1, 2, 3, 4, 5, 6, 7], 4));  // [4, 5, 6, 7, 1, 2, 3]

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

var sample3 = (function () {
  function reduceCallbackfn (matched, current) {
    current < this.inputNumber ? this.smaller.push(current) : matched.push(current);
    return matched;
  }

  return function sample3 (inputArray, inputNumber) {
    var smaller = [];
    return inputArray.reduce(reduceCallbackfn.bind({smaller: smaller, inputNumber: inputNumber}), []).concat(smaller);
  }
}());
console.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 と同じです。

function sample3 (inputArray, inputNumber) {
  var smaller = [];

  return inputArray.filter(function (value) {
    return value < inputNumber ? (smaller.push(value), false) : true;
  }).concat(smaller);
}
console.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 さん

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

const pointSort = function(array, num) {
  const preSort = (a, b) => a - b,
    mainSort = (a, b) => {
      if (a < num) {
        if (b < num) {
          return -1
        }
        return 1;
      }
      return a - b;
    };
  return array.slice().sort(preSort).sort(mainSort);
};

pointSort([4, 1, 2, 3, 5, 7, 6], 4); // [4, 5, 6, 7, 1, 2, 3]

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

const pointSort = function(array, num) {
  const preSort = (a, b) => a - b,
    overFilter = (v) => v >= num,
    lessFilter = (v) => v < num,
    arr = array.slice().sort(preSort);
  return arr.filter(overFilter).concat(arr.filter(lessFilter));
};

pointSort([4, 1, 3, 2, 5, 7, 6], 4); // [4, 5, 6, 7, 1, 2, 3]

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

これじゃダメ?w

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

src =[1,2,3,4,9,8,7,6,5,10]
threshold = 4


sorted = src.sort(function(a,b){return a-b;})
less = sorted.filter(function(e) {
    return (e < threshold);
});
result = sorted.slice(less.length, sorted.length).concat(less)


console.log(result)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/31 16:06 編集

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

    キャンセル

  • 2017/01/31 16:18

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16444questions

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

  • TypeScript

    345questions

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

  • ECMAScript

    120questions

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