2016-07-06 30 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