【问题标题】:How can I get multiple unique values from a JSON with JQuery?如何使用 JQuery 从 JSON 中获取多个唯一值?
【发布时间】:2021-06-18 20:12:57
【问题描述】:

我有这个 JSON:

var dataM = '[{"category":"cat01","subcategory":"subcat01"},{"category":"cat01","subcategory":"subcat01"},{"category":"cat01","subcategory":"subcat03"}, {"category":"cat01","subcategory":"subcat03"},{"category":"cat01","subcategory":"subcat02"},{"category":"cat02","subcategory":"subcat04"},{"category":"cat02","subcategory":"subcat04"},{"category":"cat02","subcategory":"subcat02"},{"category":"cat01","subcategory":"subcat05"}]';

我想获取唯一值并构建一个 HTML 无序列表结构,所以我做了这个:

var dataM = '[{"category":"cat01","subcategory":"subcat01"},{"category":"cat01","subcategory":"subcat01"},{"category":"cat01","subcategory":"subcat03"}, {"category":"cat01","subcategory":"subcat03"},{"category":"cat01","subcategory":"subcat02"},{"category":"cat02","subcategory":"subcat04"},{"category":"cat02","subcategory":"subcat04"},{"category":"cat02","subcategory":"subcat02"},{"category":"cat01","subcategory":"subcat05"}]';

var dataJSON = JSON.parse(dataM);
    var arrayM = []; var html='';

    for(i = 0; i< dataJSON.length; i++){    
        if(arrayM.indexOf(dataJSON[i].category) === -1){
            arrayM.push(dataJSON[i].category);        
        }        
    }

    html += '<ul>';

    for(i = 0; i< arrayM.length; i++){
        html += '<li>'+arrayM[i]+'</li>';
    }

    html += '</ul>';

$("#list").html(html);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="list"></div>

问题是我只得到唯一的类别值:

我想像这样包含每个类别的唯一子类别值:

我该如何解决?我想得到你的帮助。

【问题讨论】:

    标签: javascript jquery json


    【解决方案1】:

    我建议不要使用数组,而是使用对象,这样您就可以在键上设置每个类别,将每个子类别推入一个数组。

    然后,如果您只保留 unique 子猫,您可以使用该数组来显示它们:

    var dataM = '[{"category":"cat01","subcategory":"subcat01"},{"category":"cat01","subcategory":"subcat01"},{"category":"cat01","subcategory":"subcat03"}, {"category":"cat01","subcategory":"subcat03"},{"category":"cat01","subcategory":"subcat02"},{"category":"cat02","subcategory":"subcat04"},{"category":"cat02","subcategory":"subcat04"},{"category":"cat02","subcategory":"subcat02"},{"category":"cat01","subcategory":"subcat05"}]';
    
    var dataJSON = JSON.parse(dataM);
    var arrayM = {}; 
    var html='';
    
    for(i = 0; i < dataJSON.length; i++) {
        if (!arrayM[dataJSON[i].category]) {
            arrayM[dataJSON[i].category] = [];
        }
        arrayM[dataJSON[i].category].push(dataJSON[i].subcategory);
    }
    
    html += '<ul>';
    
    for (let [category, subcategorys] of Object.entries(arrayM)) {
        html += '<li>'+category+'</li>';
        html += '<ul>';
        subcategorys = subcategorys.filter((v, i, a) => a.indexOf(v) === i);
        for (i = 0; i < subcategorys.length; i++) {
            html += '<li>'+subcategorys[i]+'</li>';
        }
        html += '</ul>';
    }
    
    html += '</ul>';
    
    $("#list").html(html);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <div id="list"></div>

    【讨论】:

      【解决方案2】:

      为此,您可以使用reducer Reducer

      通过使用reducer,你可以同时运行filter和map。

      var dataM = [{"category":"cat01","subcategory":"subcat01"},{"category":"cat01","subcategory":"subcat01"},{"category":"cat01","subcategory":"subcat03"}, {"category":"cat01","subcategory":"subcat03"},{"category":"cat01","subcategory":"subcat02"},{"category":"cat02","subcategory":"subcat04"},{"category":"cat02","subcategory":"subcat04"},{"category":"cat02","subcategory":"subcat02"},{"category":"cat01","subcategory":"subcat05"}];
      
          
          result = dataM.reduce(function (r, a) {
              r[a.category] = r[a.category] || [];
              r[a.category].push(a.subcategory);
              return r;
          }, Object.create(null));
      
      html = '<ul>';
      
      Object.keys(result).map(keys => {
      html += "<li>" + keys + ":"
      html += "<ul>"
      result[keys].map( data => {
       html += "<li>"+data+"</li>" 
      })
      html+="</ul>"
      });
      html +="</ul>"
      $("#list").html(html)
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      
      <div id="list"></div>

      【讨论】:

      • reduce 的好用处! OP 正在寻找“独特的价值”,所以也许您可以将其实施到您的解决方案中?
      • 确定 OStone,会用 OP 更新我的答案
      • 嗨@Ostones,我已经用预期的OP更新了代码
      • 感谢您的帮助,但我看到 subcats 重复了,它必须是唯一的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      相关资源
      最近更新 更多