ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2018年12月16日日曜日

JavaScriptでPythonのrange関数っぽいものを作る

JavaScriptで連続した適当な配列を作りたい場合

const arr = [1, 2, 3, 4, 5];
でもいいですがPythonの様なrange関数でささっと作りたい場合があります。
Rangeオブジェクトは存在しますが、DOM用のオブジェクトでありPythonのものとは用途が違います。
underscore.jsで同じようなものが提供されているのでライブラリを使用するならそれがいいでしょう。

Pythonのrange関数

Pythonのrange関数はリスト(JavaScriptで言う配列)を容易に作れる関数です。
Pythonを使う方ならお馴染みでしょう。

主な仕様は、

range(0からの終了数)
range(開始数, 終了数)
range(開始数, 終了数, STEP数)

となります。引数の数によって動作が違います。


[ソース]

#! /usr/bin/env python

# -*- coding: utf-8 -*-

print("[range]")

for i in range(10):
    print(i, end=", ")
print()

for i in range(5, 10):
    print(i, end=", ")
print()

for i in range(0, 10, 2):
    print(i, end=", ")



[結果]

[range]
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
5, 6, 7, 8, 9,
0, 2, 4, 6, 8,

このような動作となります。
JavaScriptで同じような動作の関数を作ってみましょう。

ここあたり
https://dev.to/ycmjason/how-to-create-range-in-javascript-539i
を見ると、同じような考えでrange関数を作っている人がいます。

主な仕様は2番目のrange(開始数, 終了数)のようです。
Array.from() や Array.prototype.fill()を使った方法などがあるみたいです。
例にあるようなものに加え、STEP数まで加味出来る仕様にしましょう。


  function range(/* 開始数, 終了数, STEP数 */) {
    const len = arguments.length;
    const arr = [];
    let min = 0;
    let max = 0;
    let step = 1;

//引数の数により開始数と終了数を変える
    switch(len) {
      case 1:
        max = arguments[0];
      break;
      case 2:
        min = arguments[0];
        max = arguments[1];
      break;
      case 3:
        min = arguments[0];
        max = arguments[1];
        step = arguments[2];
      break;
    };

    for(let i = min; i < max; i++) {
// 第三引数があればSTEP数として処理をする
      if(step != 1) {
        if(i % step == 0) {
          arr.push(i);
        }
      }else {
        arr.push(i);
      }
    }

    return arr;
   }


//①
   const a1 = range(10);
   console.log(a1);


//②
   const a2 = range(5, 10);
   console.log(a2);


//③
   const a3 = range(1, 10, 2);
   console.log(a3);

//④
   for(let i of range2(5, 10)) {
      console.log(i);
   }


[結果]

[0,1,2,3,4,5,6,7,8,9]
[5,6,7,8,9]
[2,4,6,8]
5
6
7
8
9

レガシーな書き方ですが、こんな感じでしょうか?
④はPythonのrangeの様な使い方です。

2018年10月22日月曜日

XMLHttpRequestで画像を扱う

XMLHttpRequestで画像を読み込む


Ajaxで一部のWebデータを読み込む時、XMLHttpRequestを使いますが、テキストデータが主に読み込みの対象となっているので今回は画像データを読み込みたいと思います。

読み込み方はテキストと同じで、 読み込んだ画層データをBlobかArrayBufferとして処理するだけでOKです。


Blobによる読み込み



  
    
    XMLHttpRequest
  

  

XMLHttpRequest

もう一つの例



  
    
    XMLHttpRequest
  

  

XMLHttpRequest

2015年11月3日火曜日

learnyounodeでNode.jsを段階的に学ぶ

learnyounodeとは?

learnyounodeとは、NodeSchoolが提供するnodeモジュールのworkshoperによって作られる対話形式のチュートリアルです。
コンソールさえあれば簡単に学ぶことが出来るのでお手軽です。

元は英語ですが有志たちにより多言語化されており日本語にも対応しているので言語選択により日本語で学ぶことが出来ます。

learnyounodeの難易度としては、JavaScriptの基本はおさえており、Node.jsも入門から基本操作や幾つかのモジュールを触ったことがあれば解けるのではないでしょうか?
問題はNodeの基本といえる機能を一通り出してくれるので全問解ければNodeの概要は理解できたと言えるかもしれません。Nodeの理解や力試しにはもってこいです。

インストール

$ npm install -g learnyounode




言語選択がない場合はlearnyounode-jpをインストールしてください。

$ npm install -g learnyounode-jp

インストールできたらlearnyounodeコマンドで起ち上げます。

$ learnyounode

そこで言語選択をするか -l ja オプション追加で日本語に変換できます。
問題が出されたらその条件のアプリを作成し verify コマンドで正解かどうか検証します。



$ learnyounode verify [作成したファイル]

で正解すると[完了済み]が付きます。

他にもチュートリアルが幾つか用意されています。

NodeSchool



learnyounodeを解いてみる(2問目)
learnyounodeを解いてみる(3問目)
learnyounodeを解いてみる(4問目)
learnyounodeを解いてみる(5問目)
learnyounodeを解いてみる(6問目)
learnyounodeを解いてみる(7問目)
learnyounodeを解いてみる(8問目)

2015年8月17日月曜日

JavaScriptの配列


JavaScriptの配列

JavaScriptにも他のプログラミング言語の同様に配列を装備しています。 ただし、JavaScriptの配列はCやJavaの様に最初に長さや型が決定される配列では無く、その柔軟さはむしろリストに近いでしょう
実態は配列Objectであり、pushやイテレーターなど様々なプロパティや機能が用意されています。

配列の宣言

JavaScriptの配列の宣言方法は主に2つあります。 配列リテラルを使う方法と、Arrayコンストラクタで生成する方法です。 以下はどちらも同じ配列になります。
//配列リテラル記法
var nums = [10, 20, 30];
document.writeln(nums); //10,20,30

//Arrayコンストラクタ
var nums = new Array(10, 20, 30);
document.writeln(nums); //10,20,30
配列コンストラクタで生成する方法は引数が一つだと、配列の長さになり複数の配列だと配列要素そのものになります。
// 10,20,30の3つの要素を持つ配列
var nums = new Array(10, 20, 30);
document.writeln(nums); //10,20,30

// 10つの空要素を持つ配列
var nums = new Array(10);
document.writeln(nums); // ,,,,,,,,,
この様にArrayコンストラクタは引数が一つか複数かによって生成される配列が変わり紛らわしいので通常は配列リテラルが使われます。 Arrayコンストラクタが有効な場面は配列の長さを先に決めることが出来る点です。
//要素は決定していなが100の長さの配列を確保しています。
var nums = new Array(100);
長さは自然数でなければならないので以下はErrorです
var nums = new Array(0.1); //少数を使用しているSyntexError
var nums = new Array(-1); //マイナスの整数SyntexError
宣言時に変数側にブラケットを書くことは出来ません。このあたりはCなどと違います。
// 10の要素を確保しようとするがSyntaxError
var arr[10] = new Array();
また、いきなりブラケット演算子を使用して配列にすることもできません。 配列変数は最初に配列であると宣言しなければいきなり要素にアクセスできません。
var nums[4] = 5; //SyntaxError いきなり要素に代入している

var nums = []; //まず宣言
var nums[4] = 5; // 前に配列宣言されていれば何番目に入れようとも可能

配列の要素

JavaScriptの配列は柔軟なので、要素数や型を気にせず入れることが出来ます。
var arr = [10, "str", true, function(arg) {}, null, undefined, {}];
console.log(arr); //[10, "str", true, function, null, undefined, Object]
ただし、何も考えずに入れても扱いにくいだけですので、通常はJSONの様に決まったフォーマットなどで有効な使い方でしょう。

配列要素のアクセス

配列要素へのアクセスには、ブラケット演算子[]の0から数えた要素の番号を添え字として指定します。 これはCやJavaなど他の言語と変わりないので特に違和感ないでしょう。
var nums = [10, 20, 30];
document.writeln(nums[1]); // 20が表示される
また配列にはlengthという特殊なプロパティがセットされ全体の長さを取得できます。 これも他の言語と同じような仕組みなので違和感無く使えるでしょう。それによりfor文で全要素にアクセスできます。
var nums = [10, 20, 30];

document.writeln("length = " + nums.length); 
for(var i = 0; i < nums.length; i++) {
    document.writeln(nums[i]);
}
結果:
length = 3
10
20
30

配列とオブジェクト

JavaScriptの配列の実態はArrayオブジェクトです。ですからオブジェクトとしてプロパティを持ちメソッドを使用できます。
var arr = ["one", "two", "three"];

document.writeln(arr.toString()); //文字列として表示
document.writeln(arr); //内部でtoStringメソッドが呼び出される
document.writeln("length = " + arr.length); //lengthプロパティで個数を出力
document.writeln(typeof arr);
結果:
one,two,three
one,two,three
length = 3
object

配列を出力させると自動的にtoStringメソッドが使用され、文字列として表示されます。 typeofでタイプを調べるとobjectが表示されるように実態はオブジェクトです。
lengthプロパティは特殊なプロパティで配列の個数を出力し配列の要素を追加すれば自動的に増えます。
arr.push("four"); //pushプロパティによる追加
document.writeln(arr);
document.writeln("length = " + arr.length);

arr[4] = "five";
document.writeln(arr);
document.writeln("length = " + arr.length);
結果:
one,two,three,four
length = 4
one,two,three,four,five
length = 5

以上は直感的にも理解できるでしょう。 では飛び値の要素を追加したりlength値自体に代入するとどうなるでしょうか?
arr[9] = "ten";
document.writeln(arr);
document.writeln("length = " + arr.length);
document.writeln(arr[5]);

arr.length = 3;
document.writeln(arr);
document.writeln("length = " + arr.length);
結果:
one,two,three,four,five,,,,,ten
length = 10
undefined
one,two,three
length = 3

このように飛び値までの要素はundefinedで埋められ配列の長さは与えられた数まで伸びます。 そしてlength自体に代入するとその長さまでの配列になります。lengthプロパティは単に配列と紐付けられた変数に過ぎないということが分かります。

2015年1月3日土曜日

Fedoea20にnode.jsをインストールする

Fedora 20にサーバーサイドJavaScript環境を作るnode.jsをインストールします。
以前はRedhat系にnode.jsをインストールするにはソースからビルドする必要があったのですが、今はyumパッケージが提供されているのでそれを利用して簡単にインストールできます。CentOSもepelで提供されています。

yumでnode.jsとnpmの提供確認

$ yum info nodejs
利用可能なパッケージ
名前                : nodejs
アーキテクチャー    : i686
バージョン          : 0.10.33
リリース            : 1.fc20
容量                : 514 k
リポジトリー        : updates/20/x86_64
要約                : JavaScript runtime
URL                 : http://nodejs.org/

$ yum info npm
利用可能なパッケージ
名前                : npm
アーキテクチャー    : noarch
バージョン          : 1.3.6
リリース            : 5.fc20
容量                : 995 k
リポジトリー        : installed
提供元リポジトリー  : updates
要約                : Node.js Package Manager
URL                 : http://npmjs.org/

バージョンも公式が0.10.35だったので最新に近いものが提供されていました。
因みにnode.jsとnodeは別物なので気をつけてください。

# yum install nodejs npm

$ node -v
$ npm -v

で表示されたら成功です。




2014年6月18日水曜日

DOMのclassListを使ってみる

classListとは

classListはHTML5で追加された比較的新しいプロパティです。
リスト化されたことによりclassNameプロパティで直接操作するより簡便にクラスを変更できるようになりました。

JavaScriptでスタイルをアクティブに変更するのに便利です。

classListのメソッド

メソッド名 機能
add(class)クラスリストへクラスを追加
remove(class)クラスリストからクラスを削除
contains(class)
toggle(class)クラスリストにclassが含まれていれば削除、なければ追加
item(number)クラスリストの番号を入れることで名前を取得
lengthクラスリストの要素数

toggleを使った例




 
 
 
 classList




classList




2011年6月8日水曜日

jQueryのempty()とremove()

jQueryは似たようなセレクターやメソッドがいくつか存在しますが、比べてみることでその違いをはっきりさせておくと覚え易いです。

empty()メソッドとremove()メソッドの違い。
  • empty()は中身を削除する。
  • remove()はそのもの本体ごと削除する。
  • remove([exp])でセレクターの条件にあったものだけ削除されます。

例:
html

jQuery(empty and remove)

  • 1.Text
  • 2.TextStrongTextTextEm
  • 3.TextStrongText
  • 4.TextiTextText

cssは分かりやすいように色付け(お好みで)

li {
  background-color: lavender;
  border: 1px solid royalblue;
  height: auto;
  width : 400px;
  padding: 5px; 
}

strong {
  background-color: seashell;
  border: 1px solid fuchsia;
}

em {
  background-color: beige;
  border: 1px solid chocolate;
}

i {
  background-color: lightsalmon;
  border: 1px solid tomato;
}


jQuery部分
empty()とremove()とremove([exp])で変化を見ます
jQuery(function() {
 //liにempty()を適用します
 $("#btn1").click(function() {
  $('li').empty();
 }); 
 //liにremove()を適用します
 $("#btn2").click(function() {
  $('li').remove();
 }); 
 //em要素が含まれるliにremove()が適用されます
 $("#btn3").click(function() {
  $('li').remove(':has(em)');
 }); 
 //文字列[Strong]が含まれるliにremove()が適用されます
 $("#btn4").click(function() {
  $('li').remove(':contains("Strong")');
 });
});

初期状態

empty()を使用した場合

remove()を使用した場合

remove(':has(em)')を使用した場合

remove(':contains("Strong")')を使用した場合

2011年5月4日水曜日

関数オブジェクトとthis(JavaScript)

JavaScriptにはクラスがありませんが、コンストラクタがあるのでクラスのようなものは出来ます。
なので便宜的にクラスと呼ばせていただきます。

JavaScriptはプロトタイプベースのオブジェクト指向です。
JavaScriptでクラスを作るには関数をクラスっぽく定義するだけです。

function Person(name) {
    this.name = name;
}

簡単です。

そこからオブジェクトを作成するにはnew演算子を使えばいいだけです。
var hirosi = new Person("ヒロシ");

そしてメソッドはオブジェクトに直接追加できます。
Javaなどのクラスベースのオブジェクトと違うのはクラスベースはクラスを一度定義したら変更できないのに対し、プロトタイプベースオブジェクト指向は後からオブジェクトに直接追加できるのが特徴です。
オブジェクトにメソッドを追加するには関数オブジェクトを追加するだけです。
関数オブジェクトとは関数を変数のように扱う事の出来る仕組みでFunctionクラスのインスタンスで作れますがそれは普通の関数と同じものです。関数を実行させず(()のない形)で扱えば変数のように自在にオブジェクトとして扱えます。

メソッドを追加の例
function showName() {
    alert(this.name + "です");
};

hirosi.showName = showName;

hirosi.showName(); //"ヒロシです" とアラートされ

thisは自らのオブジェクトを指します。これは関数オブジェクトの特徴でありこれによって同じオブジェクトないの資産を活用できます。

では関数オブジェクトをオブジェクトに結びつけずに実行するとどうなるか?
function showThis() {
alert(this);
};

showThis(); //"[object Window]" が表示されます。

これはグローバル・オブジェクト、ブラウザで実行すればwindowオブジェクトが表示されます。

function showName() {
    alert(this.name);
};

var name = "ウインドウ";

showName(); //"ウィンドウ" が表示されます。

つまりグローバル変数はすべてグローバル・オブジェクトのプロパティなのですね。

2011年4月30日土曜日

constructorプロパティ(JavaScript)

■ constructorプロパティの利用


JavaScriptでは、constructorプロパティを呼ぶことで自分を生成したオブジェクトのコンストラクタ関数を呼ぶことが出来ます。

function MyObject(x) {
   this.x = x;
}

var my = new MyObject(1);

document.writeln("MyObject: " + my.constructor); 


このような結果になります。

MyObject: function MyObj(x) {  this.x = x; }


これは、定義した関数を表示しただけなので元の関数を変数として使用したものと同じ結果になります。

document.writeln((my.constructor == MyObj)); // true


これを使用してインスタンスの直接のオブジェクトが調べられます。

var arr = new Array(1, 2, 3, 4, 5);
document.writeln(arr.constructor == Array); // true
document.writeln(arr.constructor == Object); // false
document.writeln(arr instanceof Object); // true //instanceof演算子だとスーパークラスにもtrueになる


また基本型もラップされてラッパーオブジェクトとして評価されます。
document.writeln((1).constructor == Number); // true
document.writeln(("文字列").constuctor == String); // true
document.writeln((function() {}).constructor == Function); // true 


以上からconstructorプロパティはインスタンスが何のオブジェクトから生成されたか判定できるので有用です。

■ Objectオブジェクトの不思議な挙動


Objectオブジェクトのインスタンスでconstructorプロパティを生成する場合、引数を入れたObjectのインスタンスと比べるとエラーになります。

var obj = new Object();
document.writeln(obj.constructor == Object); // true

obj = new Object(1);
document.writeln(obj.constructor == Object); // false

なんだか変ですね。

参考:https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/Object/constructor

NBAの1試合平均チームスタッツ (2025-26レギュラーシーズン)

前回 の元となったデータ、チーム毎の各スタッツ平均です。   team games w l win% PTS AST BLK STL ...