jp-prefecture
Version:
Utility library dealing with prefectures and regions in Japan.
628 lines (542 loc) • 19.8 kB
JavaScript
/*!
* jp-prefecture
* Utility library dealing with prefectures and regions in Japan.
*
* @version 0.2.1
* @license MIT
* @author tsuyoshiwada
*/
(function(global, factory) {
"use strict";
typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() :
typeof define === "function" && define.amd ? define(factory) :
global.jpPrefecture = factory();
}(this, function() {
"use strict";
var VERSION = "0.2.1";
var jp;
var undefined;
var Type = {
REGION: "region",
PREF : "pref"
};
// Classification is adopted eight regional division
var regions = [
{id:1, name:"北海道", kana:"ホッカイドウ", en:"hokkaido", neighbor:[2]},
{id:2, name:"東北", kana:"トウホク", en:"tohoku", neighbor:[1]},
{id:3, name:"関東", kana:"カントウ", en:"kanto", neighbor:[2, 4]},
{id:4, name:"中部", kana:"チュウブ", en:"chubu", neighbor:[2, 3, 5]},
{id:5, name:"近畿", kana:"キンキ", en:"kinki", neighbor:[4, 6, 7]},
{id:6, name:"中国", kana:"チュウゴク", en:"chugoku", neighbor:[5, 7, 8]},
{id:7, name:"四国", kana:"シコク", en:"shikoku", neighbor:[5, 6, 8]},
{id:8, name:"九州", kana:"キュウシュウ", en:"kyusyu", neighbor:[6, 7]}
];
// See: http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E5%9C%B0%E5%9F%9F
// Also it includes the sea adjacent to the neighbor
var prefectures = [
{id:1, region:1, name:"北海道", short:"北海道", kana:"ホッカイドウ", en:"hokkaido", neighbor:[2]},
{id:2, region:2, name:"青森県", short:"青森", kana:"アオモリ", en:"aomori", neighbor:[1, 3, 5]},
{id:3, region:2, name:"岩手県", short:"岩手", kana:"イワテ", en:"iwate", neighbor:[2, 4, 5]},
{id:4, region:2, name:"宮城県", short:"宮城", kana:"ミヤギ", en:"miyagi", neighbor:[3, 5, 6, 7]},
{id:5, region:2, name:"秋田県", short:"秋田", kana:"アキタ", en:"akita", neighbor:[2, 3, 4, 6]},
{id:6, region:2, name:"山形県", short:"山形", kana:"ヤマガタ", en:"yamagata", neighbor:[4, 5, 7, 15]},
{id:7, region:2, name:"福島県", short:"福島", kana:"フクシマ", en:"fukushima", neighbor:[4, 6, 8, 9, 10, 15]},
{id:8, region:3, name:"茨城県", short:"茨城", kana:"イバラキ", en:"ibaraki", neighbor:[7, 9, 11, 12]},
{id:9, region:3, name:"栃木県", short:"栃木", kana:"トチギ", en:"tochigi", neighbor:[8, 7, 10, 11]},
{id:10, region:3, name:"群馬県", short:"群馬", kana:"グンマ", en:"gunma", neighbor:[7, 9, 11, 15, 20]},
{id:11, region:3, name:"埼玉県", short:"埼玉", kana:"サイタマ", en:"saitama", neighbor:[8, 9, 10, 12, 13, 19, 20]},
{id:12, region:3, name:"千葉県", short:"千葉", kana:"チバ", en:"chiba", neighbor:[8, 11, 13, 14]},
{id:13, region:3, name:"東京都", short:"東京", kana:"トウキョウ", en:"tokyo", neighbor:[11, 12, 14, 19]},
{id:14, region:3, name:"神奈川県", short:"神奈川", kana:"カナガワ", en:"kanagawa", neighbor:[12, 13, 19, 22]},
{id:15, region:4, name:"新潟県", short:"新潟", kana:"ニイガタ", en:"niigata", neighbor:[6, 7, 10, 16, 20]},
{id:16, region:4, name:"富山県", short:"富山", kana:"トヤマ", en:"toyama", neighbor:[15, 17, 20, 21]},
{id:17, region:4, name:"石川県", short:"石川", kana:"イシカワ", en:"ishikawa", neighbor:[16, 18, 21]},
{id:18, region:4, name:"福井県", short:"福井", kana:"フクイ", en:"fukui", neighbor:[17, 21, 25, 26]},
{id:19, region:4, name:"山梨県", short:"山梨", kana:"ヤマナシ", en:"yamanashi", neighbor:[11, 13, 14, 20, 22]},
{id:20, region:4, name:"長野県", short:"長野", kana:"ナガノ", en:"nagano", neighbor:[10, 11, 15, 16, 19, 21, 22, 23]},
{id:21, region:4, name:"岐阜県", short:"岐阜", kana:"ギフ", en:"gifu", neighbor:[16, 17, 18, 20, 23, 24, 25]},
{id:22, region:4, name:"静岡県", short:"静岡", kana:"シズオカ", en:"shizuoka", neighbor:[14, 19, 20, 23]},
{id:23, region:4, name:"愛知県", short:"愛知", kana:"アイチ", en:"aichi", neighbor:[20, 21, 22, 24]},
{id:24, region:5, name:"三重県", short:"三重", kana:"ミエ", en:"mie", neighbor:[21, 23, 25, 26, 29, 30]},
{id:25, region:5, name:"滋賀県", short:"滋賀", kana:"シガ", en:"shiga", neighbor:[18, 21, 24, 26]},
{id:26, region:5, name:"京都府", short:"京都", kana:"キョウト", en:"kyoto", neighbor:[18, 24, 25, 27, 28, 29]},
{id:27, region:5, name:"大阪府", short:"大阪", kana:"オオサカ", en:"osaka", neighbor:[26, 28, 29, 30]},
{id:28, region:5, name:"兵庫県", short:"兵庫", kana:"ヒョウゴ", en:"hyogo", neighbor:[26, 27, 30, 31, 33, 36, 37]},
{id:29, region:5, name:"奈良県", short:"奈良", kana:"ナラ", en:"nara", neighbor:[24, 26, 27, 30]},
{id:30, region:5, name:"和歌山県", short:"和歌山", kana:"ワカヤマ", en:"wakayama", neighbor:[24, 27, 28, 29, 36]},
{id:31, region:6, name:"鳥取県", short:"鳥取", kana:"トットリ", en:"tottori", neighbor:[28, 32, 33, 34]},
{id:32, region:6, name:"島根県", short:"島根", kana:"シマネ", en:"shimane", neighbor:[31, 34, 35]},
{id:33, region:6, name:"岡山県", short:"岡山", kana:"オカヤマ", en:"okayama", neighbor:[28, 31, 34, 37]},
{id:34, region:6, name:"広島県", short:"広島", kana:"ヒロシマ", en:"hiroshima", neighbor:[31, 32, 33, 35, 37, 38]},
{id:35, region:6, name:"山口県", short:"山口", kana:"ヤマグチ", en:"yamaguchi", neighbor:[32, 34, 38, 40, 44]},
{id:36, region:7, name:"徳島県", short:"徳島", kana:"トクシマ", en:"tokushima", neighbor:[28, 30, 37, 38, 39]},
{id:37, region:7, name:"香川県", short:"香川", kana:"カガワ", en:"kagawa", neighbor:[28, 33, 34, 36, 38]},
{id:38, region:7, name:"愛媛県", short:"愛媛", kana:"エヒメ", en:"ehime", neighbor:[33, 34, 35, 36, 37, 39, 44]},
{id:39, region:7, name:"高知県", short:"高知", kana:"コウチ", en:"kochi", neighbor:[36, 38]},
{id:40, region:8, name:"福岡県", short:"福岡", kana:"フクオカ", en:"fukuoka", neighbor:[35, 41, 42, 43, 44]},
{id:41, region:8, name:"佐賀県", short:"佐賀", kana:"サガ", en:"saga", neighbor:[40, 42]},
{id:42, region:8, name:"長崎県", short:"長崎", kana:"ナガサキ", en:"nagasaki", neighbor:[41, 43]},
{id:43, region:8, name:"熊本県", short:"熊本", kana:"クマモト", en:"kumamoto", neighbor:[40, 41, 42, 44, 45, 46]},
{id:44, region:8, name:"大分県", short:"大分", kana:"オオイタ", en:"oita", neighbor:[35, 38, 40, 43, 45]},
{id:45, region:8, name:"宮崎県", short:"宮崎", kana:"ミヤザキ", en:"miyazaki", neighbor:[43, 44, 46]},
{id:46, region:8, name:"鹿児島県", short:"鹿児島", kana:"カゴシマ", en:"kagoshima", neighbor:[43, 45, 47]},
{id:47, region:8, name:"沖縄県", short:"沖縄", kana:"オキナワ", en:"okinawa", neighbor:[46]}
];
// jpPrefecture base object.
function jpPrefecture(){
return this;
}
// Alias
jp = jpPrefecture;
// Current Version
jp.VERSION = VERSION;
// Return an array from the specified type
function getList(type){
if( type === Type.REGION ) return clone(regions);
else if( type === Type.PREF ) return clone(prefectures);
return undefined;
}
/**
* Get all regions or prefectures.
* @param {String}
* @param {String | Array}
* @return {Array}
*/
jp.getAll = function(type, select){
var list = getList(type);
if( list === undefined || select === undefined ) return list;
return pluck(getList(type), select);
};
/**
* Alias for getAll("region").
* @param {String | Array}
* @return {Array}
*/
jp.getAllRegion = function(select){
return jp.getAll(Type.REGION, select);
};
/**
* Alias for getAll("pref").
* @param {String | Array}
* @return {Array}
*/
jp.getAllPref = function(select){
return jp.getAll(Type.PREF, select);
};
/**
* Get the single object of regional or prefectures.
* @param {String}
* @param {Object | Any}
* @param {String | Array}
* @return {Object | Any}
*/
jp.find = function(type, value, select){
var list = getList(type), result;
if( isObject(value) ){
result = findWhere(list, value);
}else{
result = find(list, function(obj){
return contains(obj, value);
});
}
if( result === undefined ) return undefined;
return select === undefined ? result : pluck(result, select);
};
/**
* CGet the single object of regional. Alias for find("region").
* @param {Object | Any}
* @param {String | Array}
* @return {Object | Any}
*/
jp.regionFind = function(value, select){
return jp.find(Type.REGION, value, select);
};
/**
* Get the single object of prefectures. Alias for find("pref").
* @param {Object | Any}
* @param {String | Array}
* @return {Object | Any}
*/
jp.prefFind = function(value, select){
return jp.find(Type.PREF, value, select);
};
/**
* By specifying the key and value, to get a single object of regional.
* @param {String}
* @param {String}
* @param {String | Integer}
* @param {String | Array}
* @return {Object | Any}
*/
jp.findBy = function(type, key, value, select){
var obj = {};
obj[key] = value;
return jp.find(type, obj, select);
};
/**
* Alias for findBy("region").
* @param {String}
* @param {Any}
* @param {String | Array}
* @return {Object | Any}
*/
jp.regionFindBy = function(key, value, select){
return jp.findBy(Type.REGION, key, value, select);
};
/**
* Alias for findBy("pref").
* @param {String}
* @param {Any}
* @param {String | Array}
* @return {Object | Any}
*/
jp.prefFindBy = function(key, value, select){
return jp.findBy(Type.PREF, key, value, select);
};
/**
* Get the region corresponding from prefectures.
* @param {Any}
* @param {String | Array}
* @return {Object | Any}
*/
jp.regionFindByPref = function(value, select){
var pref = jp.prefFind(value);
if( pref === undefined ) return undefined;
return jp.regionFindBy("id", pref.region, select);
};
/**
* Get the prefectures corresponding from region.
* @param {Any}
* @param {String | Array}
* @return {Array}
*/
jp.prefFindByRegion = function(value, select){
var region = jp.regionFind(value), results;
if( region === undefined ) return undefined;
results = filter(prefectures, function(d){
if( d.region === region.id ) return d;
});
return select === undefined ? results : pluck(results, select)
};
/**
* Get the regional or province apply to the given conditions.
* The return value is returned always an array.
* @param {String}
* @param {Object}
* @param {String | Array}
* @return {Array}
*/
jp.where = function(type, attrs, select){
var results = where(getList(type), attrs);
return select === undefined ? results : pluck(results, select);
};
/**
* Alias for where("region").
* @param {Object}
* @param {String | Array}
* @return {Array}
*/
jp.regionWhere = function(attrs, select){
return jp.where(Type.REGION, attrs, select);
};
/**
* Alias for where("pref").
* @param {Object}
* @param {String | Array}
* @return {Array}
*/
jp.prefWhere = function(attrs, select){
return jp.where(Type.PREF, attrs, select);
};
/**
* Conversion from the specified value of the region or province to another key.
* @param {String}
* @param {Any}
* @param {String}
* @return {Any}
*/
jp.convert = function(type, value, key){
if( isArray(key) ){
key = values(key);
key = key[0];
}
return jp.find(type, value, key);
};
/**
* Alias for convert("region").
* @param {Any}
* @param {String}
* @return {Any}
*/
jp.regionConvert = function(value, key){
return jp.convert(Type.REGION, value, key);
};
/**
* Alias for convert("pref").
* @param {Any}
* @param {String}
* @return {Any}
*/
jp.prefConvert = function(value, key){
return jp.convert(Type.PREF, value, key);
};
/**
* Get the ones that are adjacent to a given region or province.
* @param {String}
* @param {Any}
* @param {String | Array}
* @return {Array}
*/
jp.getNeighbors = function(type, value, select){
var result = jp.find(type, value);
if( result === undefined ) return undefined;
return map(result.neighbor, function(id){
return jp.findBy(type, "id", id, select);
});
};
/**
* Alias for getNeighbors("region").
* @param {Any}
* @param {String | Array}
* @return {Array}
*/
jp.getRegionNeighbors = function(value, select){
return jp.getNeighbors(Type.REGION, value, select);
};
/**
* Alias for getNeighbors("pref").
* @param {Any}
* @param {String | Array}
* @return {Array}
*/
jp.getPrefNeighbors = function(value, select){
return jp.getNeighbors(Type.PREF, value, select);
};
/**
* Determine if the specified two regions or prefectures were are adjacent.
* @param {String}
* @param {Any}
* @param {Any}
* @return {Boolean}
*/
jp.isNeighbor = function(type, val1, val2){
var obj1 = jp.find(type, val1);
var obj2 = jp.find(type, val2);
if( obj1 === undefined || obj2 === undefined ) return false;
return contains(obj1.neighbor, obj2.id);
};
/**
* Alias for isNeighbor("region").
* @param {Any}
* @param {Any}
* @return {Boolean}
*/
jp.isRegionNeighbor = function(val1, val2){
return jp.isNeighbor(Type.REGION, val1, val2);
};
/**
* Alias for isNeighbor("pref").
* @param {Any}
* @param {Any}
* @return {Boolean}
*/
jp.isPrefNeighbor = function(val1, val2){
return jp.isNeighbor(Type.PREF, val1, val2);
};
/**
* Get the number of adjacent of the specified region.
* @param {String}
* @param {Any}
* @return {Integer}
*/
jp.neighborSize = function(type, value){
var result = jp.find(type, value);
return result !== undefined ? result.neighbor.length : 0;
};
/**
* Alias for neighborSize("region").
* @param {Any}
* @return {Integer}
*/
jp.regionNeighborSize = function(value){
return jp.neighborSize(Type.REGION, value);
};
/**
* Alias for neighborSize("pref").
* @param {Any}
* @return {Integer}
*/
jp.prefNeighborSize = function(value){
return jp.neighborSize(Type.PREF, value);
};
/**
* Get a list of state that contains the prefectures corresponding to the region in the multidimensional array.
* This is useful when the loop of the list was based on the regional.
* @return {Array}
*/
jp.getAllRegionInPref = function(){
var results = [];
each(jp.getAllRegion(), function(region){
results.push({
region: region,
prefectures: jp.prefWhere({region: region.id})
});
});
return results;
};
/**
* -------------------------------------------------------------
* Decision Helpers
* -------------------------------------------------------------
*/
function isArray(val){
return Object.prototype.toString.call(val) === "[object Array]";
}
function isObject(obj){
var type = typeof obj;
return type === "function" || type === "object" && !!obj && !isArray(obj);
}
function is(type, obj){
var clas = Object.prototype.toString.call(obj).slice(8, -1);
return obj !== undefined && obj !== null && clas === type;
}
/**
* -------------------------------------------------------------
* Collection Helpers
* -------------------------------------------------------------
*/
function clone(obj){
var _isArray = isArray(obj);
var _isObject = isObject(obj);
if( !_isArray && !_isObject ) return undefined;
var result = _isArray ? [] : {}, key, val;
for( key in obj ){
val = obj[key];
if( isArray(val) || isObject(val) ) val = clone(val);
result[key] = val;
}
return result;
}
function each(obj, iterate, context){
if( obj == null ) return obj;
context = context || obj;
if( isObject(obj) ){
for( var key in obj ){
if( iterate.call(context, obj[key], key) === false ) break;
}
}else if( isArray(obj) ){
var i, length = obj.length;
for( i = 0; i < length; i++ ){
if( iterate.call(context, obj[i], i) === false ) break;
}
}
return obj;
}
function map(obj, iterate, context){
if( obj == null ) return [];
var results = [], val;
each(obj, function(d, i){
val = iterate.call(context, d, i);
if( val !== null ){
results[i] = val;
}
});
return results;
}
function find(obj, predicate){
var result;
each(obj, function(d, i){
if( predicate(d, i) ){
result = d;
return false;
}
});
return result;
}
function contains(obj, value, from){
if( obj == null ) return false;
if( !isArray(obj) ) obj = values(obj);
return indexOf(obj, value, from) >= 0;
}
function matches(attrs){
var p = pairs(attrs), l = p.length, i, pair, key;
return function(obj){
if( p.length === 0 ) return false;
if( obj == null ) return !l;
obj = new Object(obj);
for( i = 0; i < l; i++ ){
pair = p[i];
key = pair[0];
if( pair[1] !== obj[key] || !(key in obj) ) return false;
}
return true;
};
}
function where(obj, attrs){
return filter(obj, matches(attrs));
}
function findWhere(obj, attrs){
return find(obj, matches(attrs));
}
function filter(obj, predicate){
var results = [];
if( obj == null ) return results;
each(obj, function(d, i){
if( predicate(d, i) ) results.push(d);
});
return results;
}
function pluck(obj, key){
var results = [], _isArray, o;
if( obj == null ) return results;
_isArray = isArray(obj);
obj = _isArray ? obj : [obj];
if( is("String", key) ){
results = map(obj, function(d){
return d == null ? undefined : d[key];
});
}else if( isArray(key) ){
results = map(obj, function(d){
o = {};
each(key, function(k){
o[k] = d[k];
});
return o;
});
}
return _isArray ? results : results[0];
}
function indexOf(array, value, from){
var i = 0, l = array && array.length;
from = isNaN(from) ? 0 : from;
for( i = from; i < l; i++ ) if( array[i] === value ) return i;
return -1;
}
function pairs(obj){
var k = keys(obj), l = k.length, p = Array(l), i;
for( i = 0; i < l; i++ ){
p[i] = [ k[i], obj[k[i]] ];
}
return p;
}
function keys(obj){
var k = [];
if( isObject(obj) || isArray(obj) ){
each(obj, function(d, i){
k.push(i);
});
}
return k;
}
function values(obj){
var k = keys(obj);
var l = k.length;
var v = Array(l);
var i;
for( i = 0; i < l; i++ ){
v[i] = obj[k[i]];
}
return v;
}
return jpPrefecture;
}));