从复杂的数组对象创建数组&在JavaScript中循环

时间:2016-02-02 18:12:03

标签: javascript arrays loops

我目前有一个复杂的订单数组(来自JSON客户端),包含多个这样的订单(包含2个):

       0:  {
"employee": "Nicole"
"total": 13
"lineItems": {
    "elements": [2]
        0:  {
            "name": "Burger"
            "price": 8
        }
        1:  {
            "name": "Lamb"
            "price": 6.50
        }
    }
}
1:  {
"employee": "Dan"
"total": 11
"lineItems": {
"elements": [2]
        0:  {
            "name": "Lamb"
            "price": 4.50
        }
        1:  {
            "name": "Meatballs"
            "price": 6.50
        }
    }
}

我想要做的是创建一个循环上面的新数组,并根据上面的lineItems对象的名称创建新的items数组。即最终输出看起来像这样:

var items = {
  "Burger" = {
    "totalSpent" : 8
  },
  "Lamb" = {
    "totalSpent" : 13
    // Note this totalSpent is an iteration or sum of all "price" items where name/id = "Lamb"
  },
  "Meatballs" = {
    "totalSpent" : 4.50
  }
}

我更习惯PHP,并尝试了许多不同版本,但似乎无法获得所需的输出。这是我到目前为止所得到的:

    var orders = //As above//
    // Initialising new array to hold my final values
    var orderItems = [];
    for (var i = 0, len = orders.length; i < len; i++){
       for(var e = 0, leng = orders[i]['lineItems']['elements'].length; e < leng; e++){
          var totalSpent = 0;
          var id = orders[i]['lineItems']['elements'][e]['name'];
          if (orders[id] in orderItems[id]){
              // overwrite existing array item
              orderItems[id]['totalSpent'] += orders[i]['lineItems']['elements'][e]['price'];
              orderItems[id].push({totalSpent : orderItems[id]['totalSpent']}); 
          }
          else {
              // Create new array item
              orderItems.push(id);
              orderItems[id].push({totalSpent : orders[i]['lineItems']['elements'][e]['price']});
          }
       }
    }

2 个答案:

答案 0 :(得分:1)

编辑:

  • 为了纠正您的orders语法,我将其添加到我的答案中,以便您可以运行Javascript代码段;
  • 将整点符号更改为括号表示法,以便于阅读和理解;
  • 纠正了有关剩余空数组的项目的错误(它位于内部);

&#13;
&#13;
    var orders = [
        {
            "employee": "Nicole",
            "total": 13,
            "lineItems": {
                "elements": [
                    {
                        "name": "Burger",
                        "price": 8
                    },
                    {
                        "name": "Lamb",
                        "price": 6.50
                    }
                ]
            }
        },
        {
            "employee": "Dan",
            "total": 11,
            "lineItems": {
                "elements": [
                    {
                        "name": "Lamb",
                        "price": 4.50
                    },
                    {
                        "name": "Meatballs",
                        "price": 6.50
                    }
                ]
            }
        }
    ];

    var items = {};

    // loop in orders array
    for (var i = 0; i < orders.length; i++) {
        var elements = orders[i]["lineItems"]["elements"];

        // loop in orders[i]["lineItems"]["elements"] object
        for (var eIndex in orders[i]["lineItems"]["elements"]) {
            
            // Add new item if it doesn't already exist
            if (!items.hasOwnProperty(elements[eIndex]["name"])) {
                items[elements[eIndex]["name"]] = {"totalSpent": elements[eIndex]["price"]};

            } else {
                // If it exists, sum totalSpent
                items[elements[eIndex]["name"]]["totalSpent"] += elements[eIndex]["price"];
            }
        }
    }

    console.log(items);
&#13;
&#13;
&#13;

PS:要找出我使用括号表示法而不是点符号的原因,请检查this question,这样做很好知道了!

答案 1 :(得分:0)

首先,您的订单数组中存在一些错误,请注意{}(对象)和[]之间的差异。然后只需简单地使用map函数迭代数组。

请参阅浏览器控制台(F12)以获取此代码段的结果

&#13;
&#13;
var orders = [{
  "employee": "Nicole",
  "total": 13,
  "lineItems": {
    "elements": [{
      "name": "Burger",
      "price": 8
    }, {
      "name": "Lamb",
      "price": 6.50
    }
                ]
  }
}, {
  "employee": "Dan",
  "total": 11,
  "lineItems": {
    "elements": [{
      "name": "Lamb",
      "price": 6.50
    }, {
      "name": "Meatballs",
      "price": 4.50
    }]
  }
}]

var items = {}

orders.map(function(order) {
  order.lineItems.elements.map(function(elem) {
    if (items[elem.name]) {
      items[elem.name].totalSpent += elem.price
    } else {
      items[elem.name] = {"totalSpent": elem.price}
    }
  })
})

console.log(items)
&#13;
&#13;
&#13;