【问题标题】:Javascript forEach inside another function另一个函数中的 Javascript forEach
【发布时间】:2018-04-07 21:42:00
【问题描述】:

简介: 我对 JavaScript 有点陌生,需要一点帮助。我要做的是构建返回一串html,我需要在html表中引入一些变量。

问题: 我正在尝试执行 forEach 循环来收集我想输出的数据。我可以循环并让数据返回就好了,但是我的 forEach 循环在另一个函数中。

代码:

'<table>' +
      '<tr><th>Product Details:</th><th></th><th></th><th></th></tr>' +
     '<tr><th>Product</th><th>Manufacture Site</th><th>Business</th><th>Hazmat #</th><th>MSDS</th></tr>' +
     myFunction() +


  '</table>'...

抱歉,阅读起来有点困难。

功能:

function myFunction() {
    productDetailsGrid.items.forEach(function(item) {
        var prod = item.data.Product;
        var sites= item.data.Sites;
        var mSDSID = item.data.MSDSID;
        var msdsLink = item.data.MSDSLink;
        var bus = item.data.Business;
        var hazMatNumber = item.data.HazMatNumber
        var str = '<tr><th>' + prod + '</th><th>' + sites+ '</th><th>' + bus + '</th><th>' + hazMatNumber + '</th><th><a href="' + msdsLink + '">' + mSDSID + '</a></th></tr>';
        return str;
    });
}

那么,既然我收到了数据,如何将每个 str 作为字符串返回给调用它的字符串呢?

【问题讨论】:

  • var str = ""放在myFunction的开头,然后做->str += ...在你的forEach里面,然后把return str放在你里面myFunction..
  • foreach 确实会返回或中断...

标签: javascript function foreach


【解决方案1】:

我建议为此目的使用reduce,因为这就是它的用途。

function myFunction() {
    return productDetailsGrid.items.reduce(function(str, item) {
        var prod = item.data.Product;
        var sites= item.data.Sites;
        var mSDSID = item.data.MSDSID;
        var msdsLink = item.data.MSDSLink;
        var bus = item.data.Business;
        var hazMatNumber = item.data.HazMatNumber
        str += '<tr><th>' + prod + '</th><th>' + sites+ '</th><th>' + bus + '</th><th>' + hazMatNumber + '</th><th><a href="' + msdsLink + '">' + mSDSID + '</a></th></tr>';
        return str;
    });
}

【讨论】:

  • Reduce 在这里是个好主意,您甚至可以删除初始化。好像没有提供一样,无论如何都会采用第一项。例如。 ["hello"," ","there"].reduce((str, item) =&gt; str += item) 将返回“你好”..
  • 不错,在更改之前我已经投票了,因为我认为reduce 是这里的最佳答案。
  • reduce 没有返回所有数据,它实际上返回的数据比选中的少。
  • 这很奇怪,因为 ['t', 'e', 's', 't'].reduce((str, el) => { return str + el }) === '测试'
【解决方案2】:

ncardeli 的回答已经很不错了。但是,如果您想将字符串作为数组获取,可以使用:

var items = [
  {
    data: {
      Product: "Product",
      Sites: "Sites",
      MSDSID: "MSDSID",
      MSDSLink: "MSDSLink",
      Business: "Business",
      HazMatNumber: "HazMatNumber"
    }
  },
  {
    data: {
      Product: "Product2",
      Sites: "Sites2",
      MSDSID: "MSDSID2",
      MSDSLink: "MSDSLink2",
      Business: "Business2",
      HazMatNumber: "HazMatNumber2"
    }
  }
]

console.log(myFunction());

function myFunction() {
    var arr = [];
    items.forEach(function(item) {
        var prod = item.data.Product;
        var sites= item.data.Sites;
        var mSDSID = item.data.MSDSID;
        var msdsLink = item.data.MSDSLink;
        var bus = item.data.Business;
        var hazMatNumber = item.data.HazMatNumber
        var str = '<tr><th>' + prod + '</th><th>' + sites+ '</th><th>' + bus + '</th><th>' + hazMatNumber + '</th><th><a href="' + msdsLink + '">' + mSDSID + '</a></th></tr>';
        arr.push(str);
    });
    return arr;
}

【讨论】:

    【解决方案3】:

    您可以使用mapjoin 来代替forEach 生成的数组:

    function myFunction() {
        return productDetailsGrid.items.map(function (item) {
            var prod = item.data.Product;
            var sites = item.data.Sites;
            var mSDSID = item.data.MSDSID;
            var msdsLink = item.data.MSDSLink;
            var bus = item.data.Business;
            var hazMatNumber = item.data.HazMatNumber
            return '<tr><th>' + prod + '</th><th>' + sites + '</th><th>' + bus + '</th><th>' + hazMatNumber + '</th><th><a href="' + msdsLink + '">' + mSDSID + '</a></th></tr>';
        }).join("");
    }
    

    【讨论】:

    • 这也是一个很好的答案,。令人惊讶的是,您可以通过多少种方法来给猫剥皮。这里的一个优势可能是性能。根据我的记忆执行array.join("") 可以提高str += 的性能..
    • @Keith join 和 concat 之间的性能争论非常有趣。我认为这取决于数组的长度以及您是否已经拥有该数组,或者您是否必须创建它然后加入它。看看这个答案及其 cmets:stackoverflow.com/a/7296616/463242
    • @ncardeli 是的,好点。我必须承认我已经有一段时间没有看到这种东西了。现代 JS 引擎非常擅长在没有帮助的情况下优化东西。自从我上次查看以来,字符串处理很可能已经走了很长一段路。
    【解决方案4】:

    您可以像这样在.forEach 之外声明变量

    function myFunction() {
        var str = "";
        productDetailsGrid.items.forEach(function (item) {
            var prod = item.data.Product;
            var sites = item.data.Sites;
            var mSDSID = item.data.MSDSID;
            var msdsLink = item.data.MSDSLink;
            var bus = item.data.Business;
            var hazMatNumber = item.data.HazMatNumber
            str += '<tr><th>' + prod + '</th><th>' + sites + '</th><th>' + bus + '</th><th>' + hazMatNumber + '</th><th><a href="' + msdsLink + '">' + mSDSID + '</a></th></tr>';
        });
        return str;
    }
    

    【讨论】:

    • 太棒了!谢谢,这个解决方案只是基本的编程......当你盯着某样东西看太久你把它复杂化时,这很有趣。 :) 欣赏它!
    • 我还有一个问题。当我从原始函数调用将它添加到表中时,我得到一个“未定义”。有任何想法吗?产品详情:未定义产品
    • 我会在 .forEach 内部调试,看看你有什么数据
    • @TigerDave 我假设你在 George 编辑之前这样做了,它是 var str 而不是 var str = "".. 这就是为什么它说是 undefined Product
    • 或者@Keith 所说的。 (感谢您指出这个问题,非常感谢)
    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多