【问题标题】:Looping through Javascript Object and adding to HTML Div循环遍历 Javascript 对象并添加到 HTML Div
【发布时间】:2021-06-01 15:10:24
【问题描述】:

我正在开发一款游戏,但遇到了一个困扰了几个小时的问题。我有一个对象,我想编写一个循环,它将获取该对象中的所有值,并将它们粘贴到一个 html div 中。我这样做的方式是,我采用了一个 div,我正在克隆它并为所有子元素赋予新值。然后我想使用 DOM 操作将一个键中的值插入到一个带有标题和两个段落的 div 中。这是代码。

索引.html

<div id = "all_asset" style = "display: none;">
    <div class = "touch_box col-sm-12" style = "height: 150px; display: none;" id = "asset_touchbox">
        <br><h id = "asset_name"></h>
        <p1 id = "asset_price"></p1><hr>
        <p id = "asset_age"></p><hr>
    </div>    
</div>

play.js

function assetsList(){
    Object.keys(assets).forEach(key => {
        for (var i = 1; i < Object.keys(assets).length; i++){
    
            //duplicate box
            var list_box = document.getElementById("asset_touchbox");
            var clone_box = list_box.cloneNode(true);
            clone_box.id = "list_assets" + String(i);
            document.getElementById("all_asset").appendChild(clone_box);

            //get id of child elements
            clone_box.getElementsByTagName('h')[0].id = "asset_name" + String(i);
            clone_box.getElementsByTagName('p1')[0].id = "asset_price" + String(i);
            clone_box.getElementsByTagName('p')[0].id = "asset_age" + String(i);
            list_box.parentNode.appendChild(clone_box);
            //show box
            clone_box.style.display = "block";

            var asset_name = assets[key][0];
            var asset_age = assets[key][1];
            var asset_price = assets[key][2];

            document.getElementById("asset_name" + String(i)).innerHTML = asset_name;
            document.getElementById("asset_price" + String(i)).innerHTML = asset_age;
            document.getElementById("asset_age" + String(i)).innerHTML = asset_price;
        }
      });      
}

Javascript 对象

//asset name, asset age, asset cost
assets = {1: ["Boat", 0, "10000"], 2: ["Carriage", 0, "10000"]}

所以我非常想做的是 - 创建两个 div,每个 div 都有来自每个键的信息。我希望我是有道理的。如果我没有,请告诉我。谢谢!

【问题讨论】:

    标签: javascript html loops dom javascript-objects


    【解决方案1】:

    您可以使用class 来简化代码。

    这是一个例子:

    // The original object given by you
    const givenAssets = {
      1: ['Boat', 0, '10000'],
      2: ['Carriage', 2, '30000']
    };
    
    // Get #all_asset
    const assetContainer = document.querySelector('#all_asset');
    
    // Define a class
    class Asset {
      // Set parameters
      constructor(id, name, price, age) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.age = age;
      }
    
      // Create HTML
      addHtml() {
        // HTML elements as string
        let html = `
          <div class="touch_box col-sm-12" id="list_asset${this.id}">
            <br>
            <h4 id="asset_name${this.id}">${this.name}</h4>
            <p id="asset_price${this.id}">${this.price}</p>
            <hr>
            <p id="asset_age${this.id}">${this.age}</p>
            <hr>
          </div>`;
          
        // Add HTML element before the end of #all_asset
        assetContainer.insertAdjacentHTML('beforeend', html);
      }
    }
    
    // Make instances and put them into an array
    let assets = [];
    for (const key in givenAssets) {
      assets.push(new Asset(key, givenAssets[key][0], givenAssets[key][1], givenAssets[key][2]))
    }
    
    // Execute .addHtml() on each asset one by one.
    assets.forEach(asset => asset.addHtml());
    &lt;div id="all_asset"&gt;&lt;/div&gt;

    【讨论】:

    • 我没有使用你的原始对象assets = {1: ["Boat", 0, "10000"], 2: ["Carriage", 0, "10000"]}。如果你想使用它,请告诉我。然后我会修改我的代码。
    • 是的,实际上。那真的很棒。
    • 我做到了。请检查它;)
    • 我删除了let html 的.replace() 部分。由于模板文字 ``.,值可以直接传递到字符串中
    【解决方案2】:

    就个人而言,我会在您的 forEach 函数中构建资产 html,而不是克隆占位符 html。下面的代码应该创建您正在寻找的结构。祝你好运!

    index.html

    <div id="all_asset"/>
    

    play.js

    const assets = {
      1: ["Boat", 0, "10000"],
      2: ["Carriage", 0, "10000"]
    }
    
    function assetsList() {
      Object.keys(assets).forEach(key => {
        // get current asset data
        const assetData = assets[key];
        // create asset container
        const container = document.createElement("div");
        // create and append asset header
        const header = document.createElement('h1');
        header.appendChild(document.createTextNode(assetData[0]))
        // create and append first p
        const p1 = document.createElement('p')
        p1.appendChild(document.createTextNode(assetData[1]))
        // crreate and append second p
        const p2 = document.createElement('p')
        p2.appendChild(document.createTextNode(assetData[2]))
        // fill out the asset container
        container.appendChild(header)
        container.appendChild(p1)
        container.appendChild(p2)
        // append the whole thing to the parent
        document.getElementById("all_asset").appendChild(container);
      })
    };
    

    【讨论】:

      【解决方案3】:

      您可能需要考虑将资产表示重构为对象数组。例如,

      let assets = [
        {
          name: 'boat',
          age: 0,
          price: 10000,
        },
        {
          name: 'carriage',
          age: 0,
          price: 10000,
        },
      ];
      

      按照您最初使用 forEach 方法迭代资产的想法,您可以为每个资产动态插入一个 div。

      assets.forEach(({ name, age, price }) => {
        let touchBox = document.createElement('div');
        touchBox.classList.add('touch_box', 'col-sm-12');
        touchBox.id = 'asset_touchbox';
        touchBox.style.height = '150px';
      
        let nameElt = document.createElement('h5');
        nameElt.id = 'asset_name';
        nameElt.innerHTML = name;
      
        let priceElt = document.createElement('p');
        priceElt.id = 'asset_price';
        priceElt.innerHTML = price;
      
        let ageElt = document.createElement('p');
        ageElt.id = 'asset_age';
        ageElt.innerHTML = age;
      
        touchBox.appendChild(nameElt);
        touchBox.appendChild(priceElt);
        touchBox.appendChild(ageElt);
      
        document.querySelector('#list_box').appendChild(touchBox);
      });
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-19
        • 2014-07-14
        • 2013-03-09
        • 2015-09-16
        相关资源
        最近更新 更多