2017-08-30 82 views
0

我有一個reactjs組件,我試圖用循環和開關來呈現數據。Reactjs循環通過數組和開關

我試了一個地圖,然後forEach - 但它聲稱它不是一個函數。

json看起來像這樣。

// JSON

"contents": { 
      "0": ["emotional distress", "behavioural difficulties", "hyperactivity and concentration difficulties", "difficulties in getting along with other young people"], 
      "5": ["kind and helpful behaviour"] 
     } 

//組件

var YourCurrentStanding = React.createClass({ 

    alertLevel: function (key) { 
     switch (key) { 
     case '0': return "very high"; 
     case '1': return "high"; 
     case '5': return "very low"; 
     default: return "xy"; 
     } 
    }, 

    render: function() { 
     console.log('this.props.data.contents', this.props.data.contents) 
     return (
      <div> 
       { 
        this.props.data.contents.forEach(function(j) { 
        return <p key={j}>Score for x,y and z {this.alertLevel(j)}</p> 
        }) 
       } 
      </div> 
     ); 
    } 
}); 

-----------應該象

"<p>Score for emotional distress, behavioural difficulties, hyperactivity and concentration difficulties very high and difficulties in getting along with other young people very high</p> 

<p>Score for kind and helpful behaviour very low</p>" 

附近工作代碼添加了語法檢查

var YourCurrentStanding = React.createClass({ 

    grammarCheck : function(vals) { 
     //x,y,z and d 
     //z 

     return vals.join(', ') 
    }, 


    alertLevel: function(key) { 
     switch (key) { 
     case "0": 
      return "very high"; 
     case "1": 
      return "high"; 
     case "5": 
      return "very low"; 
     default: 
      return "xy"; 
     } 
    }, 

    render: function() { 
     return (
     <div> 
     {Object.keys(this.props.data.contents).map((key, index) => {  
      return <p key={index}>Score for {this.grammarCheck(this.props.data.contents[key])} is <b>{this.alertLevel(key)}</b></p> 
     })} 
     </div> 
    ); 
    } 
}); 
+0

Use()=> {}函數語法與您的「this」不綁定到您的組件,而是綁定到您的匿名函數。 (我在說你的this.alertLevel) – Nevosis

+0

我在哪裏放 - 我傾向於使用var that = this - 然後調用that.alertLevel(j) –

+0

內容不是數組它是一個對象。所以它沒有forEach方法。您必須遍歷對象鍵,然後遍歷數組。 –

回答

1

這就是:(拿了樣品數據對象演示)

var data = { 
 
    contents: { 
 
    "0": [ 
 
     "emotional distress", 
 
     "behavioural difficulties", 
 
     "hyperactivity and concentration difficulties", 
 
     "difficulties in getting along with other young people" 
 
    ], 
 
    "5": ["kind and helpful behaviour"] 
 
    } 
 
}; 
 

 
var YourCurrentStanding = React.createClass({ 
 
    alertLevel: function(key) { 
 
    switch (key) { 
 
     case "0": 
 
     return "very high"; 
 
     case "1": 
 
     return "high"; 
 
     case "5": 
 
     return "very low"; 
 
     default: 
 
     return "xy"; 
 
    } 
 
    }, 
 
    
 
    joinContents: function(data, key) { 
 
    return [ data[key].slice(0, -1).join(", "), data[key].slice(-1)[0]   
 
      ].join(data[key].length < 2 ? "" : " and "); 
 
     
 
    /* 
 
    data[key].slice(0, -1).join(", "): takes all keys except last and joins them together with a comma. 
 
    data[key].slice(-1)[0]: Last key 
 
    */ 
 
    }, 
 

 
    render: function() { 
 
    return (
 
     <div> 
 
     {Object.keys(data.contents).map((key, index) => { 
 
      return (
 
      <p key={index}> 
 
       Score for {this.joinContents(data.contents, key)} is {" "} 
 
       <b>{this.alertLevel(key)}</b> 
 
      </p> 
 
     ); 
 
     })} 
 
     </div> 
 
    ); 
 
    } 
 
}); 
 

 
ReactDOM.render(<YourCurrentStanding />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="app"/>

+0

這很接近 - 如何替換xxx的值 - 「情緒困擾,行爲困難「 - 所以喜歡concat數組值 –

+0

@TheOldCounty,更新片段 – Dev

+0

需要添加一個逗號 - 並刪除尾隨逗號 –

0

只需使用這種方式的箭頭功能。正如@cesar william所說,照顧對象屬性的映射。

render: function() { 
    console.log('this.props.data.contents', this.props.data.contents) 
    return (
     <div> 
      { 
       Object.keys(this.props.data.contents).map((key, index) => 
       { 
       return <p key={index}>Score for xx {this.alertLevel(this.props.data.contents[j])}</p> 
       }) 
      } 
     </div> 
    ); 
} 

我真的沒看你的jsx段落,但這是一個好的開始。

編輯:你不應該使用索引爲重點,找到適合更好的,它只是爲例子

+0

- - 映射數據的更好方法是什麼? - 我將這些數字作爲關鍵字,以確保它按嚴重性級別排序 - 0 - 非常高 - 1 - 高,5 - 非常低 –

0

您無法通過forEach或map方法來迭代對象。

const contentKeys = Object.keys(this.props.data.contents); 
contentKeys.map(function(key, index) { 
    const item = this.props.data.contents[index]; 
    return <p key={index}>Score for xx {this.alertLevel(item)}{index !== contentKeys.length-1 ? ', ' : null}</p> 
}); 

使用索引或項調用alertLevel方法 - 取決於您。

+0

- 這攪動了內容,但沒有分隔逗號 –

+0

爲代碼段添加分隔逗號。 – chuve

+0

剛剛添加了一個語法檢查函數 - 也許如果(vals.length> 1){vals.join(「,」)//用逗號替換最後一個逗號並且} else {vals.join(「,」)} –