0
私はオブジェクトの配列を取得して、配列の配列でオブジェクトをフィルタリングしようとしています。このよう配列の配列でオブジェクトをフィルタリングする最も効果的な方法は何ですか?
:
let obj =
{
"a.1":1,
"a.2":2,
"b.1":3,
"b.2":4,
"c.1":5,
"c.2":6
}
let array =
[
["a.1","b.1"],
["a"],
["b","c.1"]
]
let expectedResult =
[
{
"a.1":1,
"b.1":3,
},
{
"a.1":1,
"a.2":2,
},
{
"b.1":3,
"b.2":4,
"c.1":5
},
]
// this is what I came up with
const filterObjectByArray = (obj, arr) =>
Object.keys(obj)
.filter(ch => {
for (var index = 0; index < arr.length; index++)
if (ch.startsWith(arr[index]))
return true;
})
.reduce((ret, key) =>{
ret[key] = obj[key]
return ret
},{})
let result = array.map(arr => filterObjectByArray(obj, arr))
//kind of deepEqual
console.log(JSON.stringify(expectedResult) == JSON.stringify(result))
それをするより簡単またはより便利な方法はありますか?私はこの操作をかなり頻繁に行う必要があり、オブジェクトは数百のエントリを大きくすることになりますので、ここで潜在的なボトルネックが発生します。
私は多分正確に、私はそれを行っているだろうかだそれLodash(http://lodash.com/)ユーティリティ – Stratboy
に見てみましょう。追加の速度を絞る必要がある場合は、機能的アプローチを純粋に手続き的に展開してテストすることができます(バニラ 'for'だけで' filter'と 'reduce'を使わずに)。しかし、私はベンチマーク*最初の*を提案して、これが恐れるほど遅いかどうかを確認することもできます(数百のエントリーであれば、毎秒100万回の検索が必要な場合を除き、あなたが知っている、 "時期尚早の最適化はすべての悪の根源です"とそのすべて。 – Amadan
'startsWith' - ' a.15'は 'a.1'で始まります。これはあなたが望むものではないかもしれないと思います。 "(ch +"。 ")startsWith(arr [index] +"。 ")'は信頼性が高くなります( 'a.15.'は' a.'で始まりますが 'a.1'ではありません)。 – Amadan