javascript - 如果属性匹配,则将新值插入数组

标签 javascript arrays

  1. 迭代 HTML 项并将它们插入数组
  2. 如果项目名称与数组中已有的对象名称属性匹配,只需将其数据添加到该对象中即可。

我尝试查看几个不同的答案,但最终要么出现控制台错误,要么覆盖我现有的数据。

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>

最佳答案

此代码将实现您的目标:

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>

关于javascript - 如果属性匹配,则将新值插入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38234359/

相关文章:

javascript - 单击 <a> 标签时加载 div 内的 PHP 文件

javascript - 单击div时更改背景图像?

c++ - 为对基础对象进行操作的函数提供派生对象数组

java - 从数组中另选打印

arrays - 有效连接字符串数组

javascript - 根据字体大小在 Canvas 中垂直居中文本

javascript - 使用 Javascript For 循环更改像素颜色

c++ - 删除数组成员的更好方法是什么?

javascript - 回调和递增变量

javascript - 在 JavaScript 中使用数组作为传递参数