3

私はパラメータの助けを借りて関数を実行しようとしている次のコードを持っています。パラメータは、それが示す配列/文字列に対して操作を実行するJavascriptを指示(idは0以外psアレイとidパラメータが0である場合propertiesストリング、およびasアレイとattributes列である例えば場合):配列アサインの参照エラー(左側のアラインメント)

var properties = "apple=fruit"; 
var attributes = "carrot=vegetable banana=fruit cherry=fruit fruit"; 
var ps = []; 
var as = []; 

function getpsas(id) 
    { 
    (id === 0 ? ps : as) = (id === 0 ? properties : attributes).split(" ").map 
    (
    function(element) 
     { 
     var eqlpos = element.lastIndexOf("="); 
     return {name: element.substr(0, eqlpos), type: element.substr(eqlpos + 1)}; 
     } 
    ).filter 
     (
     function(element) 
     { 
     return (/^(vegetable|fruit)$/.test(element.type)); 
     } 
    ); 
    } 

getpsas(0); 
getpsas(1); 

console.log(ps); 
console.log(as); 

,Fiddleここに。 (id === 0 ? ps : as) =部分に「Uncaught ReferenceError:無効な左辺が割り当てられました」がスローされます。 =の左側から角括弧を削除すると、後者の配列(別名as)のみに続く関数を実行し、前者の関数(別名ps)は実行しないという点を除いて、機能します。

私はここで間違ったことをしていることを知っています。括弧や記号のペア/記号がありません。私はoperator precedence in Javascriptをチェックしましたが、同じ問題については他の質問もありますが、すべてが正しく動作するはずです。 ===(条件付き)、=(代入用)などがあります。最も悩まされているのは、三項演算子内の他の参照が動作することです(このサンプルの右部分、私のコードの他の部分)。

これは...何が間違っていますか?

答えて

3

? :は、割り当ての左側には使用できません。三項演算子式の値は、の値がであり、の参照ではありません。です。プログラミング言語の人々は通常、のr値の値を使用します。 のl値のにのみ割り当てることができますが、の? :という値は生成できません。

"l"と "r"は "left"と "right"を表し、代入演算子を基準にしています。もちろん、すべての言語が右から左に割り当てられるわけではありません。音楽プログラミング言語「Chuck」は反例である。

あなたがオブジェクトのプロパティに値を代入している場合は、このような何かを行うことができます。? :はの左側の決意の一部である部分式であるためだ

someObject[foo == bar ? "x" : "y"] = whatever(); 

割り当て。外側の[ ]の式がのl値を返すので、これは問題ありません。

+0

私はそれが起こる正確に何を説明し、なぜ私のアプローチは間違っていたという理由だけで、これが最良の答えであることを認めざるを得ません。私は "オブジェクト"(厳密に言えば)を使用せずにこれを解決しましたが、等価の右辺部分を "ダミー配列"(_temp_という名前)に割り当て、_if(id === 0){ps = temp;} else {as = temp} _は関数の最後にあります。私の特定のコードに単純なソリューションを適用しても、あなたの答えは完璧でしたが、そうであってもすべての中で最良の答えです。ありがとうございました。修正したコメ​​ントは編集できなかったので、削除して再投稿しなければなりませんでした。 –

2

(id === 0 ? ps : as)は、psまたはasのいずれかの値を返します。あなたは変数にsomethingを割り当てたい場合は、このような何かを:

const obj = { 
    ps: [], 
    as: [], 
} 

obj[0 === id ? 'ps' : 'as'] = something; 
+0

良い答えは、ソリューション指向ですが、なぜこれが起こるかについての説明が不足しています(Pointyの答えは不足していません)。私は実際に私が間違っていた場所を理解していたので、彼の答えに印を付けなければならなかった。それにもかかわらず、私はあなたにupvoteをくれました - ありがとう。 –

1

if (0 === id) ps = something; 
else as = something; 

別の方法は、条件付きで計算されたメンバーへのアクセスを通じてメンバーをpsas周りのオブジェクトをラップし、いずれかに設定することですdestructuring assignmentには配列を指定し、右側にはcomputed property namesという結果を割り当てることができます。

function getpsas(id) { 
 
    [ps, as] = Object.assign([ps, as], { 
 
     [id]: [properties, attributes][id] 
 
      .split(" ") 
 
      .map(function (element) { var eqlpos = element.lastIndexOf("="); return { name: element.substr(0, eqlpos), type: element.substr(eqlpos + 1) }; }) 
 
      .filter(element => /^(vegetable|fruit)$/.test(element.type)) 
 
    }); 
 
} 
 

 
var properties = "apple=fruit", 
 
    attributes = "carrot=vegetable banana=fruit cherry=fruit fruit", 
 
    ps = [], 
 
    as = []; 
 

 
getpsas(0); 
 
getpsas(1); 
 

 
console.log(ps); 
 
console.log(as);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

私のコードに合ったソリューションを提供していただき、ありがとうございます。ジェフリーの答えと同じように、間違いなく役立っていますが、どこが間違っているのか説明していません。あなたをアップアップしましたか? –

+0

これは単なる答えですが、可能です。あなたの問題は[Pointy](https://www.filecrypt.cc/Container/D24940861A.html)によってよく記述されているので、繰り返す必要はありません。 –

+0

確かに。私のコメントをPointyにチェックして、一時的な配列以外の追加のオブジェクトを使わずに解決した方法を見ることができます。 –