循环遍历JS对象并检查属性是否为null

时间:2017-03-06 15:05:05

标签: javascript

尝试找到一种简单的方法来遍历对象结构,以构建queryString以传递给我的API端点。

场景 - 如果id为空,请使用codesskucodes and sku为空,则使用id,而不是使用多个if() 1}}做这个条件是否有更好的方法来实现这一目标?如果全部存在,则应默认使用sku



var loopThrough = {
            "OrderLine": [{
                "Product": {
                    "Id": null,
                    "Codes": ["1112"],
                    "Sku": "CS1112"
                },
                "TotalValue": 0,
                "Quantity": 1
            }, {
                "Product": {
                    "Id": null,
                    "Codes": ["1113"],
                    "Sku": "CS1113"
                },
                "TotalValue": 0,
                "Quantity": 1
            }],
            "OriginatingSite": {
                "Id": 1
            },
            "TotalValue": 0
        };

        var allIds = '?';
        var first = true;

        for (var i = 0; i < loopThrough.OrderLine.length; i++) {
            var orderLines = loopThrough.OrderLine[i];
            var prodId = orderLines.Product.Id;
            var prodCodes = orderLines.Product.Codes;
            var prodSku = orderLines.Product.Sku;
            if (first) {
                first = false;
                if (prodId === null) {
                    allIds = allIds + "&code=" + orderLines.Product.Codes[0];
                } else {
                    allIds = allIds + "&id=" + orderLines.Product.Id;
                }
            } else {
                if (prodId !== null) {
                    allIds = allIds + "&id=" + orderLines.Product.Id
                } else {
                    allIds = allIds + "&sku=" + orderLines.Product.Sku;
                }
            }
            console.log(allIds)
        }
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

没有太多可以改变的东西,任何更复杂的东西都会毁了整个观点。但你可以更加宽松&#39;在你的条件上,如果他们是自己的优先事项。

&#13;
&#13;
var loopThrough = {
            "OrderLine": [{
                "Product": {
                    "Id": null,
                    "Codes": ["1112"],
                    "Sku": "CS1112"
                },
                "TotalValue": 0,
                "Quantity": 1
            }, {
                "Product": {
                    "Id": null,
                    "Codes": ["1113"],
                    "Sku": "CS1113"
                },
                "TotalValue": 0,
                "Quantity": 1
            }],
            "OriginatingSite": {
                "Id": 1
            },
            "TotalValue": 0
        };

        var allIdsArr = [];
        var first = true;

        for (var i = 0; i < loopThrough.OrderLine.length; i++) {
            var orderLines = loopThrough.OrderLine[i];
            var prodId = orderLines.Product.Id;
            var prodCodes = orderLines.Product.Codes;
            var prodSku = orderLines.Product.Sku;

            allIdsArr.push(
                prodId !== null ? 'id=' + prodId :
                prodCodes !== null ? 'code=' + prodCodes :
                'sku=' + prodSku
            )
        }

        console.log('?' + allIdsArr.join('&'))
&#13;
&#13;
&#13;

答案 1 :(得分:0)

  • 不能以两种不同的方式有效地进行相同的比较,这使得代码很难阅读。
  • 除非必须,否则请使用for循环,使用map
  • 不要声明您不打算使用的变量
  • 当代码必须沿着两条不同的路径时,最小化不同路径的长度。

简短版本可能是:

&#13;
&#13;
const loopThrough = {
            "OrderLine": [{
                "Product": {
                    "Id": null,
                    "Codes": ["1112"],
                    "Sku": "CS1112"
                },
                "TotalValue": 0,
                "Quantity": 1
            }, {
                "Product": {
                    "Id": null,
                    "Codes": ["1113"],
                    "Sku": "CS1113"
                },
                "TotalValue": 0,
                "Quantity": 1
            }],
            "OriginatingSite": {
                "Id": 1
            },
            "TotalValue": 0
        };
    const url = "?" +
      loopThrough.OrderLine
        .map((order, index) => {
          const product = order.Product;
          return product.Id?
            `id=${product.Id}`:
            index === 0? 
              `sku=${product.Sku}`: 
              `code=${product.Codes[0]}`;
        })
        .join("&");
        console.log(url);
&#13;
&#13;
&#13;