2016-07-06 31 views
0
  1. 迭代並將它們推到一個數組
  2. 如果項目名稱在數組中的對象的name屬性已經一致,只是增加它的數據到該對象。

我試着尋找幾個不同的答案,但最終與控制檯錯誤或覆蓋我現有的數據。推新值數組,如果屬性相匹配,通過HTML項目

var item = {}; 
 
var items = []; 
 

 
$('li').each(function() { 
 
    var itemName = $(this).find('.name').text(); 
 
    var itemData = $(this).find('.data').text(); 
 
    
 
    //for(var i = 0, lens = items.length; i < 1; i++) { 
 
    // if(items[i].name === itemName) { 
 
    //   ? 
 
    // } 
 
    //} 
 

 
    item = { 
 
     name: itemName, 
 
     data: itemData 
 
    } 
 
    items.push(item); 
 
});
<li> 
 
    <span class="name">Item 1</span> 
 
    <span class="data">3</span> 
 
</li> 
 
<li> 
 
    <span class="name">Item 1</span> 
 
    <span class="data">6</span> 
 
</li> 
 
<li> 
 
    <span class="name">Item 1</span> 
 
    <span class="data">9</span> 
 
</li> 
 
<li> 
 
    <span class="name">Item 2</span> 
 
    <span class="data">3</span> 
 
</li> 
 
<li> 
 
    <span class="name">Item 2</span> 
 
    <span class="data">6</span> 
 
</li>

+0

你必須將jQuery添加到您的網頁'$'函數不是JavaScript的。並添加jQuery的標籤也請 –

+0

@MarioAlexandroSantini謝謝。這只是一個例子。 – TheEks

+0

如果你想有現有的數據並添加新的數據,那麼它聽起來像數據應該是一個數組(或其他容器類型)。然後你只是項目[我] .data.push(newdata)。 – nurdyguy

回答

2

這個代碼將實現自己的目標:

var items = {}; 

$('li').each(function() { 
    var itemName = $(this).find('.name').text(); 
    var itemData = $(this).find('.data').text(); 

    items[itemName] = items[itemName] || []; 
    items[itemName].push(itemData); 
}); 

var result = Object.keys(items).map(function(name) { 
    return {name: name, data: items[name]}; 
}); 

console.log(result); 

更新1:(添加其他屬性)

var items = {}; 

$('li').each(function() { 
    var itemName = $(this).find('.name').text(); 
    var itemData = $(this).find('.data').text(); 

    items[itemName] = items[itemName] || {name: itemName}; 
    //Add data 
    items[itemName].data = items[itemName].data || []; 
    items[itemName].data.push(itemData); 
    //Add other property 
    items[itemName].time = Date.now(); 
}); 

var result = Object.keys(items).map(function(name) { 
    return items[name]; 
}); 

演示:

var item = {}; 
 
var items = {}; 
 

 
$('li').each(function() { 
 
    var itemName = $(this).find('.name').text(); 
 
    var itemData = $(this).find('.data').text(); 
 
    
 
    items[itemName] = items[itemName] || []; 
 
    items[itemName].push(itemData); 
 
}); 
 

 
var result = Object.keys(items).map(function(name) { 
 
    return {name: name, data: items[name]}; 
 
}); 
 

 
console.log(result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<li> 
 
    <span class="name">Item 1</span> 
 
    <span class="data">3</span> 
 
</li> 
 
<li> 
 
    <span class="name">Item 1</span> 
 
    <span class="data">6</span> 
 
</li> 
 
<li> 
 
    <span class="name">Item 1</span> 
 
    <span class="data">9</span> 
 
</li> 
 
<li> 
 
    <span class="name">Item 2</span> 
 
    <span class="data">3</span> 
 
</li> 
 
<li> 
 
    <span class="name">Item 2</span> 
 
    <span class="data">6</span> 
 
</li>

+0

爲了簡明起見,爲了更好地回答問題,相信這樣做也會更快。 – TheEks

+0

我喜歡簡潔。祝你好運;) –

+0

RBOUH你能否添加一個推送其他屬性的例子?假設有另外一個領域,如姓名或數據。可能有助於人們在未來發現這一點。 – TheEks

1
var item = {}; 
var items = []; 

$('li').each(function() { 
    var itemName = $(this).find('.name').text(); 
    var itemData = $(this).find('.data').text(); 

    var add_new = true; 
    for(var i = 0, lens = items.length; i < lens; i++) { 
     if(items[i].name === itemName) { 
      items[i].data.push(itemData); 
      add_new = false; 
     } 
    } 
    if (add_new) { 
     item = { 
      name: itemName, 
      data: [itemData] 
     } 
     items.push(item); 
    } 
}); 
console.log(items); 
+0

有票。它是設置是否添加一個新對象的變量,這是拋棄我。謝謝! – TheEks