selectedTags
には最大3つのタグが含まれています。 vm.tags
何千ものタグを含めることができますが、たぶん数百ものタグを比較する必要があります。このdouble forlopをlodashでリファクタリングする方法は?
3つのタグのIDがvm.tags
のタグのIDと一致する場合は、境界線をオンにする必要があります。 3つのボーダーもあります:border1
、border2
、border3
です。
const tagsColorCheck =() => {
let name, selected, its_ticker;
let selectedTags = TagsFactory.retrieveTickerTags('onlyTags');
if (selectedTags.length > 0) {
for (let i=0; i<vm.tags.length; i++) {
for (let j=0; j<selectedTags.length; j++) {
if (selectedTags[j].term_id == vm.tags[i].term_id) {
name = 'border'+ (j + 1);
selected = 'selected';
its_ticker = 'its_ticker';
vm.tags[i][name] = true;
vm.tags[i][selected] = true;
vm.tags[i][its_ticker] = selectedTags[j].its_ticker;
}
}
}
}
};
は、これまでのところ、ここで私は、プロセス(_.each
)に持っているものです。
const tagsColorCheck =() => {
let name, selected, its_ticker, vmTerm, term_1, term_2, term_3, ticker_1, ticker_2, ticker_3;
let selectedTags = TagsFactory.retrieveTickerTags('onlyTags');
if (!_.isEmpty(selectedTags)) {
vmTerm = R.findIndex(R.propEq('term_id', selectedTags[0].term_id))(vm.tags);
}
if (selectedTags[0]) { term_1 = parseInt(selectedTags[0].term_id); ticker_1 = selectedTags[0].its_ticker; }
if (selectedTags[1]) { term_2 = parseInt(selectedTags[1].term_id); ticker_2 = selectedTags[1].its_ticker; }
if (selectedTags[2]) { term_3 = parseInt(selectedTags[2].term_id); ticker_3 = selectedTags[2].its_ticker; }
_.each(vm.tags, (tag) => {
if (tag.term_id === term_1) {
tag.selected = true;
tag.border1 = true;
tag.its_ticker = ticker_1;
}
if (tag.term_id === term_2) {
tag.selected = true;
tag.border2 = true;
tag.its_ticker = ticker_2;
}
if (tag.term_id === term_3) {
tag.selected = true;
tag.border3 = true;
tag.its_ticker = ticker_3;
}
})
};
そして、この(for of loop
):
const tagsColorCheck =() => {
let name, selected, its_ticker, vmTerm, term_1, term_2, term_3, ticker_1, ticker_2, ticker_3;
let selectedTags = TagsFactory.retrieveTickerTags('onlyTags');
const borderRizeTag = (tag) => {
if (tag.term_id === term_1) {
tag.selected = true;
tag.border1 = true;
tag.its_ticker = ticker_1;
}
if (tag.term_id === term_2) {
tag.selected = true;
tag.border2 = true;
tag.its_ticker = ticker_2;
}
if (tag.term_id === term_3) {
tag.selected = true;
tag.border3 = true;
tag.its_ticker = ticker_3;
}
return tag;
}
if (!_.isEmpty(selectedTags)) {
vmTerm = R.findIndex(R.propEq('term_id', selectedTags[0].term_id))(vm.tags);
}
if (selectedTags[0]) { term_1 = parseInt(selectedTags[0].term_id); ticker_1 = selectedTags[0].its_ticker; }
if (selectedTags[1]) { term_2 = parseInt(selectedTags[1].term_id); ticker_2 = selectedTags[1].its_ticker; }
if (selectedTags[2]) { term_3 = parseInt(selectedTags[2].term_id); ticker_3 = selectedTags[2].its_ticker; }
for (let tag of vm.tags) {
console.log(tag);
tag = borderRizeTag(tag);
}
console.log('vmTerm',vmTerm);
};
それは働いて、それが維持/理解しやすいですし、それがどの速く得ることはありません。だからなぜそれをlodash版に変換したいのですか? O.o - あなたのlodashスクリプトは、3つのタグに固定されていて、簡単に拡張できないように、やや混乱します。バニラ版にはこのすべてが無料で用意されています。 – Andreas
実際の速度は気にしませんが、読みやすいです。機能的なプログラミング... forループは読みにくいですが、forループの二重はただの下痢です。 –
@LeonGaban毎日機能的な言語でプログラムを作っていて、私が欲しいと思ってもループを書くことができない人として、あなたのdouble forループはあなたの他のバージョンよりもすぐに読みやすくなっていると伝えます。私は後で答えを書きますが、一般的な声明として「forループは読みにくい」という盲目的な信念を受け入れません。しばしばそうですが、あなたのケースではforループが勝ちます。 Andreas氏によると、あなたの他のバージョンは拡張性がなく、理由を説明するのが難しいです。 – Josh