2016-11-12 5 views
1

schreiben Funktion COUNTWORDS, die, wenn eine Zeichenfolge als Argument angegeben, ein Objekt zurückgibt, wo Schlüssel die Wörter in der Kette sind, und die Werte sind die Anzahl der Vorkommen des Wortes innerhalb des Strings:Wie kann ich auf diesen Objektschlüssel in dieser Bedingung zugreifen?

function countWords(string){ 
    string = string.split(" "); 
    var newObj = {}; 
    for(var i = 0 ; i === newObj.string ; i++){ 
     if(newObj['i'] === newObj[string]){ 
      newObj[string[i]] = i ; 
     } 
    } 
     return newObj; 
    } 
countWords("hello hello"); // => {"hello": 2} 
countWords("Hello hello"); // => {"Hello": 1, "hello": 1} 
countWords("The quick brown"); // => {"The": 1, "quick": 1, "brown": 1} 

I Da Sie den Index des Split-Strings nicht zählen müssen, müssen Sie die Bedingungen von i < string.length zu i === key value of of the objects ändern. Warum kann ich mit newObj.string nicht auf die Strings zugreifen?

+0

'newObj.string' macht keinen Sinn, auf ein neu definierten leeres Objekt machen, die noch keine Eigenschaften haben. Sie wollen die Array-Länge verwenden, also nicht sicher, wo die Idee, die Sie brauchen, um es zu ändern kommt von – charlietfl

Antwort

1

Sie könnten dies mit reduce() anstelle von for Schleife tun.

function countWords(string) { 
 
    return string.split(' ').reduce(function(r, e) { 
 
    r[e] = (r[e] || 0) + 1; 
 
    return r; 
 
    }, {}) 
 
} 
 
console.log(countWords("hello hello")) 
 
console.log(countWords("Hello hello")) 
 
console.log(countWords("The quick brown"))

Code könnte so gehen mit for Schleife.

function countWords(string) { 
 
    var string = string.split(" "); 
 
    var newObj = {}; 
 

 
    for (var i = 0; i < string.length; i++) { 
 
    newObj[string[i]] = (newObj[string[i]] || 0) + 1 
 
    } 
 
    return newObj; 
 
} 
 
console.log(countWords("hello hello")); 
 
console.log(countWords("Hello hello")); 
 
console.log(countWords("The quick brown"));

+0

Ja, ich sah diese Antwort vor, danke. Aber ich möchte wissen, wie man es mit der For-Schleife löst, bevor ich in reduziere, – heliu

+0

Vielen Dank !! Ich glaube, ich war irgendwie nah dran und musste die String.length nicht ändern. aber noch eine Frage .. newObj [string [i]] = (newObj [string [i]] || 0) + 1 nennt man das einen ternären Operator? mit truthy und falsy Werten? – heliu

+0

Gern geschehen, das ist kein ternärer Operator das ist '(Bedingung)? true: false ', das setzt einfach jeden Schlüssel-Standardwert auf 0. –

0

function countWords(string){ 
 
    return string 
 
    .split(" ") 
 
    .reduce((acc, curr) => { 
 
     if (curr in acc) { 
 
     acc[curr]++ 
 
     } else { 
 
     acc[curr] = 1 
 
     } 
 
     return acc 
 
    }, {}) 
 
} 
 
console.log(countWords("hello hello")); 
 
console.log(countWords("Hello hello")); 
 
console.log(countWords("The quick brown"));

0

Sie können es in der folgenden Art und Weise tun, indem Sie mit der hasOwnProperty Funktion zu überprüfen, ob eine Eigenschaft im Objekt JavaScript vorhanden ist, wenn es Schritt tut die Zählung und wenn nicht, dann initialisiere die Zählung auf 1.

function countWords(data) { 
 
    var words = data.split(" "); 
 
    var item = {}; 
 
    for (var i = 0; i < words.length; i++) { 
 
    var prop = words[i]; 
 
    item.hasOwnProperty(prop) ? item[prop] ++ : item[prop] = 1; 
 
    } 
 

 
    console.log(item); 
 
    return item; 
 
} 
 

 
countWords("hello hello"); // => {"hello": 2} 
 
countWords("Hello hello"); // => {"Hello": 1, "hello": 1} 
 
countWords("The quick brown"); // => {"The": 1, "quick": 1, "brown": 1}

Verwandte Themen