//tips
//smart contract
リストの加工で詰まっている箇所が出ているので、そちらの要因を確認。mixlist.forEacの中に入れたninjax.foreachがスキップされてしまっている。
mixlist.forEach(item=>{
console.log('item')
console.log(item)
console.log('ninjax')
console.log(ninjax)
ninjax.forEach(q=>{
console.log('q')
console.log(q)
if(item.userid==q){
ninjafinal.push(item)
}
})
}
ここをもっとシンプルな形に変えてみる。
if(mixdone){
console.log('mixdone&&ninjafinal==[]')
ninjafinal= mixlist.filter(mix=>{
ninjax.forEach(q=>{
console.log('q')
if (mix.userid == q) {
return mix;
}
})
})
これもできない。なぜかfilter部分がスキップされてしまう。
https://qiita.com/hirakuma/items/fd7b6492939951190496
Filterのみで完結できる技を見つけたので実行。
if(mixdone){
console.log('mixdone&&ninjafinal==[]')
const vfilt=mixlist.filter(x => ninjax.includes(x.userid))
console.log('mixlist')
console.log(mixlist)
console.log('vfilt')
console.log(vfilt)
console.log('ninjax')
console.log(ninjax)
なぜかvfiltに配列が格納されない。
console.log(mixlist.filter(x => x.userid==‘2’))は機能することが確認できた。
const result=mixlist.filter(function(x){
ninjax.forEach(item=>{
console.log('yes,item')
return x.userid==item
})
})
https://stackoverflow.com/questions/34901593/how-to-filter-an-array-from-all-elements-of-another-array
気がついた。先の参照例は既に使えないもので、mixlistに対してfilterは使えないのではないか。
https://stackoverflow.com/questions/60633156/filter-array-of-objects-if-object-contains-attribute-with-value-present-in-anoth
こちらはエラー。
const result=mixlist.filter(({userid}) =>
userid.some(v => ninjax.includes(v))
);
https://localcoder.org/filter-array-of-objects-based-on-another-array-in-javascript
https://gist.github.com/jherax/f11d669ba286f21b7a2dcff69621eb72
Ninjaxがうまく取得できていないからではないかと気づく。
ninja.forEach(Item => {が実行される前に読み込まれている可能性がある。
下記の条件を確認。
if(mixdone&&ninjax!=[]){
console.log('mixdone&&ninjafinal==[]')
console.log('mixlist')
console.log(mixlist)
console.log('ninjax')
console.log(ninjax)
無事にmixlistもninjaxも取得できている状態。
それでもconsole.log(mixlist.filter(x => ninjax.includes(x.userid)))が表示できない。
var filtered = mixlist.filter(function(item) {
return ninjax.indexOf(item.userid) !== -1 ;
});
console.log('filtered')
console.log(filtered)
こちらも効果なし。
探っていくとninjax=[]が何か不可思議な挙動をしている。letからvarに変更。
console.log('ninjax')
console.log(ninjax)
console.log('ninjax[0]')
console.log(ninjax.includes(2))
Object.prototype.toString.call(ninjax)
useeffect下にsetninjafinal(ninjax)を挿入。
やっと謎が解けた。
console.log('ninjafinal')
console.log(ninjafinal)
console.log(ninjafinal.includes(2))
console.log('mixlist.filter(x => ninjafinal.includes(x.userid)')
console.log(mixlist.filter(x => ninjafinal.includes(x.userid)))
const [ninjafinal,setninjafinal]=useState([])を利用してuseeffectでninjaxを格納することで認識された。
Renderingタイミングとうまくあわず内容が反映できていない。どうこれらの内容を反映させるか。