2017-11-13 6 views
4

指定された文字列からオブジェクトを作成するJS関数を記述する必要があります。文字列はオブジェクトキーです。繰り返される文字は2度は含まれません。すべてのキーの値はゼロです。javascript - missing arrays

例:入力objFromStr("aaabc")はここ{a: 0, b: 0, c: 0}

を返す必要がありますが、私のソリューションです:

function objFromStr(inStr) { 
    let charsArr = inStr.split(""); 

    let charsObj = {}; 
    var alreadyInArr = []; 

    for (var i = 0; i < charsArr.length; i++) { 
    if (!(alreadyInArr.includes(charsArr[i]))) { 
     charsObj[charsArr[i]] = 0; 
    } else { 
     alreadyInArr.push(charsArr[i]); 
    } 
    } 

    return charsObj; 
} 

予想通り、このソリューションは動作しますが、私は理由を理解していません。 alreadyInArrを使用して、文字の重複をチェックします。しかし、私がalreadyInArrを記録すると、それは空です。

ので、このコードを実行した後:

function objFromStr(inStr) { 
    let charsArr = inStr.split(""); 

    console.log("charsArr is:", charsArr); 

    let charsObj = {}; 
    var alreadyInArr = []; 

    for (var i = 0; i < charsArr.length; i++) { 
    if (!(alreadyInArr.includes(charsArr[i]))) { 
     charsObj[charsArr[i]] = 0; 
    } else { 
     alreadyInArr.push(charsArr[i]); 
    } 
    } 

    console.log("alreadyInArr is:", alreadyInArr); 

    return charsObj; 
} 

console.log(objFromStr("aaabc")); 

私の出力は次のとおりです。 alreadyInArrが空であると予想されるように、まだ機能はまだ動作する理由

charsArr is: [ 'a', 'a', 'a', 'b', 'c' ] 
alreadyInArr is: [] 
{ a: 0, b: 0, c: 0 } 

誰かが、説明できますか?ここで

はペンです:https://codepen.io/t411tocreate/pen/bYReRj?editors=0012

+2

alreadyInArrに項目があり、alreadyInArrが空の場合は、何かをalreadyInArrに追加します。 – James

+1

それはなぜ機能するのですか?値を上書きするだけなので... – epascarello

+2

オブジェクトに対して同じキーを複数回定義することはできません。あなたのコードは 'obj ['a'] = 0'を繰り返し設定することができます。結果objには' a 'という名前のキーがあります。 'a:0'となります。 – IrkenInvader

答えて

3

else句は、正しい場所に要素をプッシュしなかったため、まったく到達できません。ループ内にconsole.log()を追加すると、すべての繰り返しで配列がまだ空であることがわかります。代わりに、要素が好きなら状態でプッシュされるべき

for (var i = 0; i < charsArr.length; i++) { 
    if (!alreadyInArr.includes(charsArr[i])) { 
     charsObj[charsArr[i]] = 0; 
     alreadyInArr.push(charsArr[i]); 
    } 
} 

は、この情報がお役に立てば幸いです。

function objFromStr(inStr) { 
 
    let charsArr = inStr.split(""); 
 

 
    console.log("charsArr is:", charsArr); 
 

 
    let charsObj = {}; 
 
    var alreadyInArr = []; 
 

 
    for (var i = 0; i < charsArr.length; i++) { 
 
    if (!alreadyInArr.includes(charsArr[i])) { 
 
     charsObj[charsArr[i]] = 0; 
 
     alreadyInArr.push(charsArr[i]); 
 
    } 
 
    } 
 

 
    console.log("alreadyInArr is:", alreadyInArr); 
 

 
    return charsObj; 
 
} 
 

 
console.log(objFromStr("aaabc"));

2

あなたelse句はincludes()がtrueを返した場合にのみ、その配列にプッシュを意味します。

したがって、実際には何もプッシュしません。

3

あなたはあなたのコードビットをshortifyことができます。

const string = "aabbcc", result = {}; 

for(const char of string) 
    result[char] = 0; 
2
if (!(alreadyInArr.includes(charsArr[i]))) { 
     charsObj[charsArr[i]] = 0; 
    } else { 
     alreadyInArr.push(charsArr[i]); 
    } 

alreadyInArr.includesへのあなたのコールが前面に!を持っています。これは次のように解釈されます:NOT(alreadyInarrにCharrsArr [i]という文字が含まれている場合):

これは、文字が配列にない場合に表示されます。

あなたは、それは常にtrueになりますそれには何も押さないと

2

あなたはcarctersを広げて欲しかったプロパティを持つオブジェクトをマップすることができ、他の部分にステップインすることはありませんので、配列は常に空なので。

function objFromStr(inStr) { 
 
    return Object.assign(...Array.from(inStr, k => ({ [k]: 0 }))); 
 
} 
 

 
console.log(objFromStr('aaaabbc'));

+0

私は解決策が大好きですが、質問には答えません。 ; P – ktilcu

1

他の人がすでに述べたように、あなたは常にあなたのオブジェクトを上書きし、あなたがあなたのコードを削減することができます0

を割り当てているので、アクセスは、アレイにプッシュすることができますされていません次のように入力します。

var arr = "aabbc", obj = {}; 

function objFromStr(inStr) {   
    arr.split("").forEach(function(x){ 
     obj[x] !== undefined ? obj[x]++ : obj[x] = 1; 
    });  
    return obj; 
} 

console.log(objFromStr(arr)); 

このようにすると、セパで何かをプッシュまたはトラッキングする必要はありませんレートアレイ。 objをチェックして、キーがすでに存在するかどうかを確認します。そうであれば1を加算し、それ以外の場合は1とカウントします。