2011-11-18 50 views
5

Tôi có 3 biến với chuỗi chứa giá trị được phân cách bằng dấu phẩy (Tôi không biết có bao nhiêu) mà tôi muốn kết hợp thành đối tượng jQuery.Giá trị được phân tách bằng dấu phẩy: từ chuỗi thành đối tượng đến danh sách

"name1,name2,name3,nameN" 
"value1,value2,value3,valueN" 
"id1,id2,id3,idN" 

tới:

var item1 = { name: name1, value: value1, id: id1 }; 
var item2 = { name: name2, value: value2, id: id2 }; 
var item3 = { name: name3, value: value3, id: id3 }; 
var itemN = { name: nameN, value: valueN, id: idN }; 

Để sau đó lặp một hoạt động trên từng hạng mục, ví dụ để nối thêm một danh sách:

<h3>items</h3> 
<ul> 
    <li>item1</li> 
     <ul> 
      <li>value: <b>value1</b></li> 
      <li>id: <b>id1</b></li> 
     </ul> 

    [...] 

    <li>itemN</li> 
     <ul> 
      <li>value: <b>valueN</b></li> 
      <li>id: <b>idN</b></li> 
     </ul> 
<ul> 

cách tốt nhất để làm điều này là gì?

+0

Bạn bị kẹt ở đâu? – heneryville

+0

Ngay từ đầu, thực sự. Tôi biết tôi có thể sử dụng tách, nhưng sau đó tôi thấy mình với mảng kết hợp các giá trị cùng loại ... –

Trả lời

11

Bạn có thể xây dựng một loạt các mặt hàng của bạn như thế này:

var names = "name1,name2,name3,nameN"; 
var values = "value1,value2,value3,valueN"; 
var ids = "id1,id2,id3,idN"; 

var namesArray = names.split(","); 
var valuesArray = values.split(","); 
var idsArray = ids.split(","); 

var item, items = []; 
for (var i = 0; i < namesArray.length; i++) { 
    item = {}; 
    item.name = namesArray[i]; 
    item.value = valuesArray[i]; 
    item.id = idsArray[i]; 
    items.push(item); 
} 

Sau đó, để xây dựng HTML từ đó, bạn có thể làm điều này:

var main = $("<ul>"); 
var str = ""; 
for (var i = 0; i < items.length; i++) { 
    str += "<li>" + items[i].name + "</li><ul><li>value: <b>" + items[i].value + "</b></li>"; 
    str += "<li>id: <b>" + items[i].id + "</b></li></ul>"; 
} 
main.html(str); 
$(document.body).append("<h3>items</h3>") 
$(document.body).append(main); 

Bạn có thể thấy nó hoạt động ở đây: http://jsfiddle.net/jfriend00/yWU3L/4/.

+0

Tôi đã thêm phần HTML. – jfriend00

+0

Tôi vừa thử nó. "Var item, items = [];" một phần không hoạt động. Tôi chia thành hai dòng nhưng tôi kết thúc với một vấn đề khác: mọi giá trị trong danh sách giờ là "nameN, valueN, idN". Tôi sẽ đăng ví dụ ngay lập tức. –

+0

Tôi đã sửa một mã và nó hoạt động ở đây: http://jsfiddle.net/jfriend00/yWU3L/4/. – jfriend00

1

Bạn có thể muốn sử dụng DOM cho việc này.

Sử dụng innerHTML có nghĩa là có HTML nội dòng trong javascript của bạn. Điều này phá vỡ Seperations of concerns và dẫn đến địa ngục bảo trì.

Live Example

var createListFragment = (function() { 
    function createItems(names,value,ids) { 
     var namesArray = names.split(","); 
     var valuesArray = value.split(","); 
     var idsArray = ids.split(","); 

     return namesArray.map(function (name, key) { 
      return { 
       name: name, 
       value: valuesArray[key], 
       id: idsArray[key] 
      } 
     });   
    } 

    function createLi(item) { 
     var itemLi = document.createElement("li"); 
     itemLi.textContent = item.name; 

     var propertiesUl = document.createElement("ul"); 
     itemLi.appendChild(propertiesUl); 

     var valueLi = document.createElement("li"); 
     valueLi.appendChild(document.createTextNode("value: ")); 
     var b = document.createElement("b"); 
     b.textContent = item.value; 
     valueLi.appendChild(b); 
     propertiesUl.appendChild(valueLi); 

     var idLi = document.createElement("li"); 
     idLi.appendChild(document.createTextNode("id: ")); 
     var b = document.createElement("b"); 
     b.textContent = item.id; 
     idLi.appendChild(b); 
     propertiesUl.appendChild(idLi); 

     return itemLi; 
    } 

    function createListFragment(names, values, ids) { 
     var items = createItems(names, values, ids); 
     var fragment = document.createDocumentFragment(); 

     var h3 = document.createElement("h3"); 
     h3.textContent = "items"; 
     fragment.appendChild(h3); 

     var ul = document.createElement("ul"); 
     fragment.appendChild(ul); 

     items.forEach(function (item) { 
      var li = createLi(item); 
      ul.appendChild(li); 
     }); 

     return fragment; 
    } 

    return createListFragment; 
})(); 

Bạn có thể cần một DOM-shimES5-shim cho phù hợp trình duyệt chéo.

+0

Mã này không tách mối quan tâm ít hơn so với ví dụ innerHTML. Trong cả hai trường hợp, bạn đang tạo HTML qua javascript để không có sự phân tách mối quan tâm. Tôi rất muốn biết tại sao bạn cho rằng mã này có thể duy trì được nhiều hơn phiên bản innerHTML? Trong phiên bản innerHTML, nó không quan trọng để xem HTML nào đang được tạo. Trong phiên bản của bạn, bạn phải đảo ngược kỹ sư mã để tìm ra HTML thực sự đang được tạo ra. – jfriend00

+0

FYI, mã tạo HTML của bạn là 31 dòng so với 8 dòng cho phiên bản innerHTML. Chiều dài không phải là thước đo của sự tốt lành, nhưng trong trường hợp này, nó liên quan đến sự đơn giản. Mã của bạn chỉ phức tạp hơn rất nhiều và yêu cầu một shim ES5 cho khả năng tương thích giữa các trình duyệt. Câu trả lời này được thiết kế cho một người không có nhiều kinh nghiệm về javascript. Câu trả lời nào bạn nghĩ rằng họ sẽ tìm thấy nhanh hơn để hiểu, đơn giản hơn để thực hiện và dễ dàng hơn để duy trì? – jfriend00

+0

Tôi nên thêm (vì lợi ích của người đọc khác) rằng cuộc hội thoại này có liên quan đến những gì đang diễn ra trong câu trả lời này: http://stackoverflow.com/questions/8190024/is-innerhtml-still-considered-to-be-evil -và tại sao/8190182 # 8190182. – jfriend00

Các vấn đề liên quan