Javascriptでオブジェクトの配列から特定の値を持つ要素を抜き出す

よく使うのでメモ。
次のようなオブジェクトの配列(連想配列の配列)があった場合、

//オブジェクトの配列
var objArray = [
    {'name':'apple','price':300, 'weight':100},
    {'name':'orange','price':200 , 'weight': 50},
    {'name':'banana','price':100, 'weight': 120}
];

関数

/**
* @function Array.prototype.pickObj オブジェクトの配列から要素を抜き出す
*/
if(!Array.prototype.pickObj){
    Object.defineProperty(Array.prototype, "pickObj", {
        configurable: false,
        enumerable: false,
        writable: false,
        /**
        * @string keys オブジェクトのキー
        * @param patterns 探索する値
        */
        value: function(key,...patterns) {
           return this.filter(e => patterns.includes(e[key]));
        }
    });
}

※2018/10/31修正
上記方法2及び3については、当初、inArray処理を無骨にも以下のように定義していたのですが、ttatsfさんコメントよりArray.prototype.includes (ES2016) を採用しました。

const inArray =  (value,array) => [].indexOf.call(array,value) > -1;  //inArrayの定義

処理→出力

var objArray = [
    {'name':'apple','price':300, 'weight':100},
    {'name':'orange','price':200 , 'weight': 50},
    {'name':'banana','price':100, 'weight': 120}
];

console.log(objArray.pickObj('price',300)); //価格が300に等しい
console.log(objArray.pickObj('price',100, 200)); //価格が100または200に等しい 

結果

{'name':'apple','price':300}
[
    {'name':'orange','price':200, 'weight':50},
    {'name':'banana','price':100, 'weight': 120}
]

Leave a Reply

Your email address will not be published. Required fields are marked *