JavaScript将循环结果组合或分组到唯一数组中

时间:2014-09-24 21:38:55

标签: javascript arrays grouping

我不确定如何正确地将这个问题放到我想去的地方。我有一个运行良好的JavaScript。它返回了一组庞大的数据,我需要将它们分组以便以更易读的方式显示。

示例代码

        function parsePData(data) {

            var xmlDoc = $j.parseXML(data.d);
            var $xml = $j(xmlDoc);
            var items = $xml.find("Page");
            userFavorites = $xml;

            var newHtml = ""

            for (var i = 0; i < items.size(); i++) {

              newHtml += "<div style='margin:5px; padding:5px; border-bottom: 1px dotted #9C9C9C; font-  size:95%'><div> <b>#" + (i + 1) + ".</b>Item to Publish: " + items[i].getAttribute("Title") +

                "</div><div class='itpPub'> Publication Target: " + items[i].parentNode.getAttribute("Title") +

                "</div></div>";
            }

我需要一些关于如何分组此输出的相关帖子的指示或指示。如果我错过了明显的帖子,请道歉。

代码创建以下输出:

Item to Publish: a , Publication Target: 1
Item to Publish: a , Publication Target: 2
Item to Publish: b , Publication Target: 7

我需要去:

Item to Publish: a , Publication Target: 1, 2
Item to Publish: b , Publication Target: 7

2 个答案:

答案 0 :(得分:1)

因此,阅读您的帖子,听起来您需要在将数据附加到DOM之前对其进行预处理:


输出你得到:

要发布的项目:a, 出版目标:1

要发布的项目:a, 出版目标:2

要发布的项目:b, 出版目标:7


您想要的输出:

要发布的项目:a, 出版目标:1,2

要发布的项目:b, 出版目标:7


我们可以使用JS对象文字的键/值配对来帮助实现这一目标。为了考虑多个值,我们将包含值的数组存储到键/值对中。

由于我无法访问您的items数组实际返回的内容,因此我只创建了一些测试数据以显示它应该如何工作。 JSFIDDLE:http://jsfiddle.net/biz79/pLb38t0y/

希望您可以根据自己的目的进行调整。

// create storage object literal and key/value vars
var storage = {};
var key,value;

// some test data
var items = [
  { "Title" : "a", "Value" : "1" },
  { "Title" : "a", "Value" : "2" },
  { "Title" : "b", "Value" : "3" } 
];

// iterate items array and populate storage
for (var i =0; i<items.length; i++) {
  key = items[i].Title;
  value = items[i].Value;

  // if the key exists in storage, add to it
  if ( key in storage ) {
    storage[key].push( value );
  }
  else {
  // if the key doesn't exist, create key and add to it
    storage[key] = [];
    storage[key].push(value);
  }
}

// iterate storage for answers
for (var prop in storage) {
    if (storage.hasOwnProperty(prop)){
      alert("Item to Publish: " + prop);
      alert("Publication Target: " + storage[prop].join(','));
    }
}

答案 1 :(得分:0)

对于这样的情况,我喜欢使用对象属性是唯一的这一事实。我已经尝试过不要修改你的代码了。我引入了一个objectItems对象,并将其属性用于组标题。在每个标题中,我存储了一个包含该组标题的数组。

输出或多或少相同。在一个新循环(for..in循环到属性上的迭代器)中,您可以输出键(= propety name = group title),以及该属性的数组值中的连接值。

&#13;
&#13;
function parsePData(data) {

            var xmlDoc = $j.parseXML(data.d);
            var $xml = $j(xmlDoc);
            var items = $xml.find("Page");
            userFavorites = $xml;

            // Create an object to cotnain the titles.
            var groupedItems = {};
            
            for (var i = 0; i < items.size(); i++) {
              // If the grouped object doesn't contain this title yet, add it and initialize to
              // and empty array.
              var prop = items[i].getAttribute("Title");
              if (! groupedItems.hasOwnProperty(prop))
                groupedItems[prop] = new Array();

              // Push new item onto the array.
              groupedItems[prop].push(items[i].parentNode.getAttribute("Title"));
            }
  
            var newHtml = ""
  
            // Actual output using the grouped array.
            for (var k in groupedItems)
            {
                newHtml += "<div style='margin:5px; padding:5px; border-bottom: 1px dotted #9C9C9C; font-  size:95%'><div> <b>#" + (i + 1) + ".</b>Item to Publish: " + k +

                "</div><div class='itpPub'> Publication Target: " +
                  groupedItems[k].join(',') +

                "</div></div>";
&#13;
&#13;
&#13;