LoginSignup
asdfghjkl99031518
@asdfghjkl99031518

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

gas while文の使い方

解決したいこと

while文によって空白を追加したい

発生している問題・エラー

while文が機能していないのか空白が追加されません。

該当するソースコード

function compare(data) {
const nullarray = [""]
let newarray = []
for(var i=1; i <300 ; i++){
if(data[i][15] !== "ok"){
newarray.push(data[i])
}
else{
continue
}
let matchCount = 0
for(var j=1; j < 301 ; j++){
if(i !== j && data[i][1] === "SinglePhrase" && data[j][1] === "SinglePhrase" && data[i][15] !== "ok" && data[j][15] !== "ok"){
if (data[i][12] === data[j][12] ) {
newarray[newarray.length - 1] = newarray[newarray.length - 1].concat(data[j]);
data[j].push("ok")  
matchCount += 1
}               
}

}
}

while (newarray[newarray.length - 1] < 105) {
newarray[newarray.length - 1] = newarray[newarray.length - 1].concat(nullarray);
}

return newarray
}

自分で試したこと

whileの位置を変えたりした。

0

2Answer

期待される入力と出力が何も説明されていないので推測ですが、 data は文字列の配列の配列ですよね? そして各配列のインデックス1に "SinglePhrase" が、インデックス15に "ok" が入っていたりいなかったりすると。

data = [
  [..., "SinglePhrase", ... "ok", ...],
  [..., "SinglePhrase", ... "ok", ...],
];

だとすれば newarray も文字列の配列の配列になります。 while の条件式 newarray[newarray.length - 1] < 105 では、 newarray の最後の要素(つまり文字列の配列)を取り出して105と比較しています。ここで、空でない配列 < 105 は常に false になります:

$ node
> const newarray = [["x", "SinglePhrase", "y"], ["z", "SinglePhrase", "w"]]
undefined
> newarray[newarray.length - 1] < 105
false

よって while の中身は一度も実行されません。

なお、ご質問の「while文によって空白を追加したい」については、空白とは何か、空白をどこにいくつ追加したいのか、ある入力が与えられたとき期待される出力はどうなるか、などが明らかでないので答えられません。


追記:「空でない配列 < 105 は常に false になります」は誤りでした。配列の長さが1で要素が数値または数値として解釈できる文字列なら、 その数値 < 105 の結果に等しくなります。

> ["104"] < 105
true
> ["105"] < 105
false
> ["104", "1"] < 105
false
1

Comments

  1. 回答ありがとうございます。
    function compareniよってできるneewarrayという二次元配列の要素の列数をそろえたく今だと105に統一しようとていました。
  2. 列数をそろえるために、各行の末尾に空白(空文字列なり空白文字なり)を追加するということですね。それならば、 while の条件式は newarray[newarray.length - 1].length < 105 としてください。
  3. .length追加してみましたが結果変わらずでした。
  4. 繰り返しますが、入力も出力も分からず、どういう出力になってほしいかも曖昧な状態で結果変わらずと言われても答えられません。
  5. 今のコードだと newarray の中の最後の配列だけ空白を足すようになっています。 newarray に含まれるすべての配列に空白を足すには、最後の while 文が for(var i=1; i <300 ; i++){ ... } 文の中に含まれるように移動してください。
  6. 他には data[i][15] !== "ok" に一致する入力がないせいで newarray が空のままになっているとか、 compare() の結果を確認する手段がそもそも間違っていて結果が変わっていないように見えるとか色々考えられます。

    ともかく、 compare() の中の色々な場所で console.log(data[i]) や console.log(newarray) などを実行して変数の値をチェックし、ご自分の予想と違う値になっている箇所を突き止めてください。そうすれば問題を絞り込めます。その問題に関係しないコードをそぎ落として単純化し、サンプルの入力と出力を添えて質問していただければこちらも答えやすくなります。
  7. 返信が遅れ大変申し分けございません。
    移動したらできました。ありがとうございます。

もしかして

-   const nullarray = [""]
+   const nullarray = [" "]

Logger.log(変数名); でログ出力できるので、それでどこで意図しない動作になっているか調査すると良いと思います。

0

Comments

  1. そこも間違いですね、、、ありがとうございます。
    変更してみたのですが結果変わらずでした。
  2. ログ確認しても結果はすべて適用されない状態になっていました。

Your answer might help someone💌