【问题标题】:Key/Value Pairs with Multiple Values具有多个值的键/值对
【发布时间】:2021-04-05 15:29:40
【问题描述】:

我一直在尝试用多个值来解决键/值对。 我要做的是遍历 div 中的列表,从 LIs 获取值,然后根据它们所在的 div 创建一个键,然后将这些 LIs 附加到另一个 div用他们的钥匙作为标题。我得到一个基本结果,但我的代码只产生一个结果:每个键一个值。我想为每个键生成多个值。

我想最终得到一个这样的对象,但我不知道如何使用我拥有的数据动态生成它:

{ "bands": [
    { "band": "beatles", "musician": "john" },
    { "band": "beatles", "musician": "paul" },
    { "band": "beatles", "musician": "ringo" },
    { "band": "beatles", "musician": "george" },
    { "band": "stones", "musician": "mick" },
    { "band": "stones", "musician": "keith" },
    { "band": "stones", "musician": "ronnie" },
    { "band": "stones", "musician": "charlie" },

] }

HTML

<button>Click 'em</button>
<div id="beatles">
  <ul>
    <li>John</li>
    <li>Paul</li>
    <li>Ringo</li>
    <li>George</li>
  </ul>
</div>

<div id="stones">
  <ul>
    <li>Mick</li>
    <li>Keith</li>
    <li>Ronnie</li>
    <li>Charlie</li>
  </ul>
</div>

<div id="beatlesList">
  <ul></ul>
</div>
<div id="stonesList">
  <ul></ul>
</div>

JS/JQ

$('button').click(function(){
    var $bands = {}
  $('ul li').each(function(){
    var $bandName = $(this).parents('div').attr('id');
    var $bandMember = $(this).text();
    console.log($bandName);
    $bands[$bandName] = $bandMember;
  })
  console.log($bands);
  $.each($bands,function(k,v){
    if(k === "beatles") {
        $('#beatlesList').prepend('<h2>' + k + '</h2>')
        $('#beatlesList ul').append('<li>' + v + '</li>')
    } else {
        $('#stonesList').prepend('<h2>' + k + '</h2>')
        $('#stonesList ul').append('<li>' + v + '</li>')
    }
  })
})

预期的 HTML 结果

<button>Click 'em</button>
<div id="beatles">
  <ul>
    <li>John</li>
    <li>Paul</li>
    <li>Ringo</li>
    <li>George</li>
  </ul>
</div>

<div id="stones">
  <ul>
    <li>Mick</li>
    <li>Keith</li>
    <li>Ronnie</li>
    <li>Charlie</li>
  </ul>
</div>

<div id="beatlesList">
<h2>beatles</h2>
  <ul>
<li>John</li>
<li>Paul</li>
<li>Ringo</li>
<li>George</li>
</ul>
</div>
<div id="stonesList">
<h2>stones</h2>
  <ul>
<li>Mick</li>
<li>Keith</li>
<li>Ronnie</li>
<li>Charlie</li>
</ul>
</div>

JSFiddle

【问题讨论】:

  • 所以你正在将一个列表移动到另一个 div。为什么不移动整个列表并将键添加为标题而不是循环遍历列表?
  • 我不想移动列表,我想根据某些要求(存在某个类)从各种元素动态创建一个。上面的例子是一个简化的例子。
  • 请从该输入中显示您的 HTML 的预期输出。
  • 您发布的 JSON 是否被使用?看起来您可能只想将整个 UL 从一个位置移动到另一个位置。对吗?
  • 请看前面的评论。这是一个简化的案例。

标签: javascript jquery key-value


【解决方案1】:

在我的脑海中并不是 100% 清楚你在追求什么。我认为这会做你似乎正在尝试的事情。如果最终您希望移动物品而不是克隆和按摩它们,那么当然可以简化此答案。当然,我可以让你的要求完全不正确。您发布的 JSON 是如何影响这一点的?您是在寻找那个 JSON 结果,还是寻找您发布的结果 HTML,或者两者兼而有之?

document.getElementById("go").addEventListener("click", function(){

  var sources = Array.from(document.querySelectorAll(".sourceData"));
  sources.forEach(function(item){
    var target = document.getElementById(item.id + "List");
    if (!target) { return; }
    
    var targetTitle = item.id
    targetTitle = targetTitle.charAt(0).toUpperCase() + targetTitle.slice(1);
    target.querySelector("h2").innerText = targetTitle;

    var parent = target.querySelector("ul");
    var children = Array.from(item.querySelectorAll("li"));
    children.forEach(function(item){
      var el = document.createElement("li");
      el.innerText = item.innerText;
      parent.appendChild(el);
    });
  });
  
});
#beatles, #beatlesList { background-color: aliceblue; }
#stones, #stonesList { background-color: mistyrose; }
<div id="beatles" class="sourceData">
  <ul>
    <li>John</li>
    <li>Paul</li>
    <li>Ringo</li>
    <li>George</li>
  </ul>
</div>

<div id="stones" class="sourceData">
  <ul>
    <li>Mick</li>
    <li>Keith</li>
    <li>Ronnie</li>
    <li>Charlie</li>
  </ul>
</div>

<div id="beatlesList">
  <h2></h2>
  <ul></ul>
</div>

<div id="stonesList">
  <h2></h2>
  <ul></ul>
</div>

<button id="go">Go</button>

【讨论】:

  • 我喜欢你用纯 JavaScript 做这个。
  • 我只使用 JSON,因为它似乎符合我的需要。我只需要创建一个对象,我可以在同一个键中拥有多个值。我正在寻找 HTML 结果;我不知道我是如何到达那里的。
【解决方案2】:

我不清楚您为什么需要这样做。但是下面的方法对你有用。

您要做的是创建一个对象,该对象具有单个对象bands,而该对象又应包含一组对象。因此,您需要构建包含 bandmusician 属性的对象数组。

var $bands = {}
$bands.bands = [];
$('ul li').each(function(){
  var $bandName = $(this).parents('div').attr('id');
  var $bandMember = $(this).text();
  $bands.bands.push({band: $bandName, musician: $bandMember});
});
console.log($bands.bands);

现在$bands.bands 包含一个对象数组,您可以使用forEach 循环它们。

$bands.bands.forEach(function(object){
if(object.band === "beatles") {
    //$('#beatlesList').prepend('<h2>' + object.band + '</h2>')
    $('#beatlesList ul').append('<li>' + object.musician + '</li>')
} else {
    //$('#stonesList').prepend('<h2>' +object.band+ '</h2>')
    $('#stonesList ul').append('<li>' + object.musician + '</li>')
}

});

我注释掉了添加标题的行,因为您不想为每个对象添加标题。相反,您可以将其添加到 html。

Working fiddle

【讨论】:

    【解决方案3】:

    此代码将创建您想要的对象

    var $bands = {'bands':[]};
      $('ul li').each(function(){
        var $bandName = $(this).parents('div').attr('id');
        var $bandMember = $(this).text();
        console.log($bandName);
    
        $bands['bands'].push({'band':$bandName,'musician':$bandMember});
      })
    

    这是fiddle

    您现在可以遍历对象并创建您想要的列表。

    【讨论】:

    • 谢谢。我试试看。
    【解决方案4】:

    您不应该从 html 构建数据,而应该从数据构建 html。

    但是,由于您可能出于某种原因需要此功能,因此字典是键值集。因此,如果您有两个或多个具有相同键的值,则最后写入的值将覆盖先前的值。您应该将每个对象设置为值数组

    $('button').click(function(){
        var $bands = {};
        $('ul li').each(function(){
            var $bandName = $(this).parents('div').attr('id');
            var $bandMember = $(this).text();
            console.log($bandName);
    
            //if the key doesn't exist create it as an array
            if($bands[$bandName] == undefined)
                $bands[$bandName] = [];
            //add value to array
            $bands[$bandName].push( $bandMember);
        })
        console.log($bands);
        $.each($bands,function(k,v){
            //using k which could be dynamic you could even create the whole thing being dynamic appending new div tags to the body element if they do not exist
            if(k === "beatles") {
                $('#beatlesList').prepend('<h2>' + k + '</h2>');
                //iterate through each value in array
                for(var i = 0; i < v.length;i++) {
                    $('#beatlesList ul').append('<li>' + v[i] + '</li>');
                }       
            } else {
                $('#stonesList').prepend('<h2>' + k + '</h2>');
                for(var i = 0; i < v.length;i++) {
                    $('#stonesList ul').append('<li>' + v[i] + '</li>');
                }
            }
        })
    })
    

    【讨论】:

    • 感谢您的反馈。我现在意识到我在滥用 JSON,而我以前没有。我不需要 JSON,它只是我锁定的工具,因为它似乎适合我的需要。我只需要一个工具来完成我上面描述的事情。
    【解决方案5】:
            var parameters = new[] {
                new KeyValuePair<string, object?>("@param1", obj.param1),
                new KeyValuePair<string, object?>("@param2", obj.param2),
                new KeyValuePair<string, object?>("@param3", obj.param3),
                new KeyValuePair<string, object?>("@param4", obj.param4)
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 2012-03-05
      • 2015-01-22
      • 2015-10-02
      • 1970-01-01
      相关资源
      最近更新 更多