JavaScriptでオブジェクトの配列から何かを探す時に使うメソッドをまとめてみた
はじめに
JavaScriptで開発をしていて、これmapにする必要ある?という時があります。
そういう時、filterとかfindとかで置き換えようと試みます。
でも、ブランクが長いとすぐにやりかたが浮かんでこないです。
いちいち調べ直してて効率悪いなぁと困っていました。
なので、一旦整理して見ようと思います。
その上で、具体的なテストケースも含めてサンプルコード形式でまとめておいて、ときどき素振りしてブランクを短くしようと思います。
やってみたこと
よく使う次のメソッドの使い方を、自分流で可能な限りシンプルにまとめてみました。その上でサンプルコードを書いてみました。
まとめ
シンプルなまとめとMDNへのリンクを書きました(よく見るので)
- Arrayで欲しい時系
- filter:条件にマッチした配列を返す MDN
- 単体のObjectで欲しい時系
- 添字で欲しい
- findIndex:条件にマッチする最初の要素の位置を返すMDN
- Booleanで欲しい時系
- その他
- map:自分ルールでは、上記で対応できなかったらこれを使う。各要素に実行した関数の結果を新しい配列として返すMDN
サンプルコードの前提
次のデータを使っています
const data = [
{
"id":1,
"name":"apple",
"price":100
},
{
"id":2,
"name":"banana",
"price":200
},
{
"id":3,
"name":"cherry",
"price":300
},
{
"id":4,
"name":"apple",
"price":400
},
{
"id":5,
"name":"apple",
"price":100
},
]
サンプルコード
filter
条件にマッチした配列を返す MDN
const resultFilter = data.filter( d => {
return d.name === 'apple';
})
console.log("resultFilter = " + JSON.stringify(resultFilter, undefined, 2));
// resultFilter = [
// {
// "id": 1,
// "name": "apple",
// "price": 100
// },
// {
// "id": 4,
// "name": "apple",
// "price": 400
// },
// {
// "id": 5,
// "name": "apple",
// "price": 100
// }
// ]
find
find:条件にマッチする最初の要素を返す MDN
逆順だと結果が変わることがあるので2パターン書いてます
const resultFind = data.find( d => {
return d.name === 'apple';
})
console.log("resultFind = " + JSON.stringify(resultFind, undefined, 2));
// resultFind = {
// "id": 1,
// "name": "apple",
// "price": 100
// }
const resultFind2 = data.reverse().find( d => {
return d.name === 'apple';
})
console.log("resultFind2 = " + JSON.stringify(resultFind2, undefined, 2));
// resultFind2 = {
// "id": 5,
// "name": "apple",
// "price": 100
// }
reduce
reduce:各要素にreducer関数を実行した結果を返すMDN
const resultReduce = data.reduce( (prev, curr) => {
return {
id: 6,
name: prev.name + curr.name,
price: prev.price + curr.price
}
})
console.log("resultReduce = " + JSON.stringify(resultReduce, undefined, 2));
// resultReduce = {
// "id": 6,
// "name": "applebananacherryappleapple",
// "price": 1100
reduceRight
reduceRight:reduceと同じだが逆順に処理した結果を返すMDN
const resultReduceRight = data.reduceRight( (prev, curr) => {
return {
id: 6,
name: prev.name + curr.name,
price: prev.price + curr.price
}
})
console.log("resultReduceRight = " + JSON.stringify(resultReduceRight, undefined, 2));
// resultReduceRight = {
// "id": 6,
// "name": "appleapplecherrybananaapple",
// "price": 1100
// }
findIndex
findIndex:条件にマッチする最初の要素の位置を返すMDN
逆順だと結果が変わることがあるので2パターン書いてます
const resultFindIndex = data.findIndex( d => {
return d.name === 'apple';
})
console.log("resultFindIndex = " + JSON.stringify(resultFindIndex, undefined, 2));
// resultFindIndex = 0
const resultFindIndex2 = data.reverse().findIndex( d => {
return d.name === 'apple';
})
console.log("resultFindIndex2 = " + JSON.stringify(resultFindIndex2, undefined, 2));
// resultFindIndex2 = 0
includes
includes: 指定した要素が含まれていたら(参照が同じなら)trueを返すMDN
配列内の内容が同じでも、参照が違うと結果が変わるのでそれがわかりやすいように3パターン書いてます。
const resultIncludes = data.includes(
{
"id":1,
"name":"apple",
"price":100
}
)
console.log("resultIncludes = " + JSON.stringify(resultIncludes, undefined, 2));
// resultIncludes = false
const copyOfdata0 = {...data[0]};
const resultIncludes2 = data.includes(copyOfdata0)
console.log("resultIncludes2 = " + JSON.stringify(resultIncludes2, undefined, 2));
// resultIncludes2 = false
const data0 = data[0];
const resultIncludes3 = data.includes(data0)
console.log("resultIncludes3 = " + JSON.stringify(resultIncludes3, undefined, 2));
// resultIncludes3 = true
some
各要素に実行した関数の結果が1つでも合格したらtrueを返すMDN
一つも合格しないパターンも書いてます。
const resultSome = data.some( d => {
return d.name === 'apple';
})
console.log("resultSome = " + JSON.stringify(resultSome, undefined, 2));
// resultSome = true
const resultSome2 = data.some( d => {
return d.name === 'hoge';
})
console.log("resultSome2 = " + JSON.stringify(resultSome2, undefined, 2));
// resultSome2 = false
every
各要素に実行した関数の結果が全部合格したらtrueを返すMDN
一つも合格しないパターンも書いてます。
const resultEvery = data.every( d => {
return d.name === 'apple';
})
console.log("resultEvery = " + JSON.stringify(resultEvery, undefined, 2));
// resultEvery = false
const resultEvery2 = data.every( d => {
return d.name === 'hoge';
})
console.log("resultEvery2 = " + JSON.stringify(resultEvery2, undefined, 2));
// resultEvery2 = false
map
自分ルールでは、他のメソッドで対応できなかったらこれを使う。各要素に実行した関数の結果を新しい配列として返すMDN
const resultMap = data.map( (d) => {
return d;
})
console.log("resultMap = " + JSON.stringify(resultMap, undefined, 2));
// resultMap = [{"id":1,"name":"apple","price":100},{"id":2,"name":"banana","price":200},{"id":3,"name":"cherry","price":300},{"id":4,"name":"apple","price":400},{"id":5,"name":"apple","price":100}]
全部
最後に、全部まとめて一つにすることで素振りビリティの高いサンプルコードを書いてみました。
const data = [
{
"id":1,
"name":"apple",
"price":100
},
{
"id":2,
"name":"banana",
"price":200
},
{
"id":3,
"name":"cherry",
"price":300
},
{
"id":4,
"name":"apple",
"price":400
},
{
"id":5,
"name":"apple",
"price":100
},
]
const resultFilter = data.filter( d => {
return d.name === 'apple';
})
console.log("resultFilter = " + JSON.stringify(resultFilter, undefined, 2));
// resultFilter = [
// {
// "id": 1,
// "name": "apple",
// "price": 100
// },
// {
// "id": 4,
// "name": "apple",
// "price": 400
// },
// {
// "id": 5,
// "name": "apple",
// "price": 100
// }
// ]
const resultFind = data.find( d => {
return d.name === 'apple';
})
console.log("resultFind = " + JSON.stringify(resultFind, undefined, 2));
// resultFind = {
// "id": 1,
// "name": "apple",
// "price": 100
// }
const resultFind2 = data.reverse().find( d => {
return d.name === 'apple';
})
console.log("resultFind2 = " + JSON.stringify(resultFind2, undefined, 2));
// resultFind2 = {
// "id": 5,
// "name": "apple",
// "price": 100
// }
const resultReduce = data.reduce( (prev, curr) => {
return {
id: 6,
name: prev.name + curr.name,
price: prev.price + curr.price
}
})
console.log("resultReduce = " + JSON.stringify(resultReduce, undefined, 2));
// resultReduce = {
// "id": 6,
// "name": "applebananacherryappleapple",
// "price": 1100
// }
const resultReduceRight = data.reduceRight( (prev, curr) => {
return {
id: 6,
name: prev.name + curr.name,
price: prev.price + curr.price
}
})
console.log("resultReduceRight = " + JSON.stringify(resultReduceRight, undefined, 2));
// resultReduceRight = {
// "id": 6,
// "name": "appleapplecherrybananaapple",
// "price": 1100
// }
const resultFindIndex = data.findIndex( d => {
return d.name === 'apple';
})
console.log("resultFindIndex = " + JSON.stringify(resultFindIndex, undefined, 2));
// resultFindIndex = 0
const resultFindIndex2 = data.reverse().findIndex( d => {
return d.name === 'apple';
})
console.log("resultFindIndex2 = " + JSON.stringify(resultFindIndex2, undefined, 2));
// resultFindIndex2 = 0
const resultIncludes = data.includes(
{
"id":1,
"name":"apple",
"price":100
}
)
console.log("resultIncludes = " + JSON.stringify(resultIncludes, undefined, 2));
// resultIncludes = false
const copyOfdata0 = {...data[0]};
const resultIncludes2 = data.includes(copyOfdata0)
console.log("resultIncludes2 = " + JSON.stringify(resultIncludes2, undefined, 2));
// resultIncludes2 = false
const data0 = data[0];
const resultIncludes3 = data.includes(data0)
console.log("resultIncludes3 = " + JSON.stringify(resultIncludes3, undefined, 2));
// resultIncludes3 = true
const resultSome = data.some( d => {
return d.name === 'apple';
})
console.log("resultSome = " + JSON.stringify(resultSome, undefined, 2));
// resultSome = true
const resultSome2 = data.some( d => {
return d.name === 'hoge';
})
console.log("resultSome2 = " + JSON.stringify(resultSome2, undefined, 2));
// resultSome2 = false
const resultEvery = data.every( d => {
return d.name === 'apple';
})
console.log("resultEvery = " + JSON.stringify(resultEvery, undefined, 2));
// resultEvery = false
const resultEvery2 = data.every( d => {
return d.name === 'hoge';
})
console.log("resultEvery2 = " + JSON.stringify(resultEvery2, undefined, 2));
// resultEvery2 = false
const resultMap = data.map( (d) => {
return d;
})
console.log("resultMap = " + JSON.stringify(resultMap, undefined, 2));
// resultMap = [{"id":1,"name":"apple","price":100},{"id":2,"name":"banana","price":200},{"id":3,"name":"cherry","price":300},{"id":4,"name":"apple","price":400},{"id":5,"name":"apple","price":100}]
おわりに
時々素振りします。
Discussion