【问题标题】:How to return from a function multiple variables?如何从函数返回多个变量?
【发布时间】:2017-08-01 16:27:55
【问题描述】:

编辑:

最终我想打印出这样的东西: 滑板车有3种材质:“木头”、“金属”、“玻璃”;棒球棒有两种材质:“木头”、“金属”仅使用 for 循环。

我正在使用以下内容:

var data = [
    {
     "title": "scooter", 
     "materials": ["wood", "metal", "glass"]
    }, 
   {
    "title": "baseball bat", 
    "materials": ["wood", "metal"]
   },
  {
    "title": "coffee table", 
    "materials": ["wood"]
  }];

我认为我可以使用 for 循环进行简单的传递,以获取标题、计数并创建一个数组,如下所示:

 function testing () {
   let items = []; //contains the titles
   let container = []; //contains the materials
   let count = 0; //count of items
   for (let i=0; i<data.length; i++){
    if (data[i].materials.length > 2){
    container.push(data[i].materials); 
    count = data[i].materials.length;
    items.push(data[i].title)
   }
  }return container;
 }
console.log(testing);

我不知道代码是否正确,可以得到我想要的东西。有什么想法吗?

编辑:因此,当我运行此代码时,我只是获取材料列表。做退货和console.log(testing)的时候;我正在获取项目列表。

看起来计数只是获取标题而不是材料的数组计数。

使用附加代码进一步编辑:

function testing () {
  let items = []; 
  let container = []; 
  let count = 0; 
  let result = '';
   for (let i=0; i<data.length; i++){
    if (data[i].materials.length > 2){
      container.push(data[i].materials); 
      items.push(data[i].title)
       for (let j=0; j<container.length; j++){
        result= `${items[j]} has materials :${container[j]}`;
       }
     }
   }return result;
 }
console.log(testing());

通过上面的内容,我可以得到最后一个标题来显示符合 if 语句的项目列表。但是,我无法计算材料的数量。例如,它只是显示: 棒球棒的材质有木头、金属

我面临的问题是如何获得计数,然后显示所有匹配的对象。所以它会改为: 滑板车有 3 种材料,分别是:木材、金属、玻璃 棒球棒有两种材质:木头、金属

【问题讨论】:

  • 好吧,当你尝试运行它时发生了什么?
  • “我不知道代码是否正确,可以得到我想要的。” 那么,是还是不是?你遇到问题了吗?如果有,什么问题?
  • 您的代码有点难以阅读,但是是的。如果要返回多个值,则需要将所有值存储在某个容器中。除了将它们放在列表中,您还可以将它们存储在 JavaScript 对象中。
  • 你只能从一个函数返回一个值,当然可以是一个对象或数组。但是为什么要打扰呢?在函数中构建字符串,并将该字符串返回打印。
  • 我们需要更多细节:您正在寻找的准确输出;您使用的确切实际代码;您遇到的问题/错误

标签: javascript arrays for-loop


【解决方案1】:

如果我正确理解了您的问题,那么您实际上并不需要 for 循环。数组有 map 方法,可以将你的函数应用到数组的每个元素上。

var data = [
    {
     "title": "scooter", 
     "materials": ["wood", "metal", "glass"]
    }, 
   {
    "title": "baseball bat", 
    "materials": ["wood", "metal"]
   },
  {
    "title": "coffee table", 
    "materials": ["wood"]
  }];
 
var result = data.map(item => `${item.title} has ${item.materials.join(', ')}`).join('\n') 
console.log(result);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

【讨论】:

  • 除非我试图通过使用 for 循环过程来学习。否则你的代码就在现场。
  • 它也忽略了 if 语句,只关注长度大于 2 的那些。
【解决方案2】:

看看下面的代码是否对你有任何帮助:

console.log(data.map(item => `${item.title} has ${item.materials.join(', ')}`).join('\n'))

【讨论】:

    【解决方案3】:

    您需要做的就是映射每个项目并连接格式化的字符串。

    您需要知道材料的数量才能显示数量。

    const capitalize = s => s.charAt(0).toUpperCase() + s.substr(1);
    const quantity = x => 'one,two,three,four,...'.split(',')[x - 1];
    
    var data = [{
        "title": "scooter",
        "materials": ["wood", "metal", "glass"]
      }, {
        "title": "baseball bat",
        "materials": ["wood", "metal"]
      }, {
        "title": "coffee table",
        "materials": ["wood"]
      }
    ];
    
    console.log(data.map(item => {
      return [
        capitalize(item.title),
        ' has ',
        quantity(item.materials.length),
        ' material' + (item.materials.length > 1 ? 's' : '') + ': ',
        item.materials.map(material => {
          return '"' + material + '"';
        }).join(', ')
      ].join('');
    }).join('; '));
    .as-console-wrapper { top: 0; max-height: 100% !important; }

    【讨论】:

      【解决方案4】:

      首先,

      console.log(testing);
      

      只是要返回函数的文本,你必须运行函数,像这样

      console.log(testing());
      

      这是我的函数,写的是 ES6:

      var data = [
          {
           "title": "scooter", 
           "materials": ["wood", "metal", "glass"]
          }, 
         {
          "title": "baseball bat", 
          "materials": ["wood", "metal"]
         },
        {
          "title": "coffee table", 
          "materials": ["wood"]
        }];
      
      function newTestingES6() {
        let printStr = '';
        for (let obj of data) { 
          printStr = `${obj.title} has ${obj.materials.length} materials: ${[...obj.materials]}`
          console.log(printStr);      
        }
      
        return 1;
      }
      
      function runTest() {
        console.log(newTestingES6());
      }
      

      【讨论】:

        【解决方案5】:

        尝试编写一个function,它适用于您的数组中的一个object。如果可行,您可以简单地在 for-loop 中调用此函数并将其推送到数组中,或者使用默认返回 arrayArray.map()

        功能

        function createConstructionKit(object) {
            var matarials = object.materials.join('", "') // this will give you for the first case -> wood", "metal", "glass
            var title = object.title // no logic -> just did it to have lesser to write in the next line..
            var capitilizedTitle = title.charAt(0).toUpperCase() + title.slice(1) // capitilize the first one and return all letters off the first index
            return capitilizedTitle + ' has ' + object.materials.length + ' materials: "' + matarials + '"'
        }
        

        地图解决方案

        var buildingInstructionsdata = data.map(function(object) {
            return createConstructionKit(object)
        })
        

        循环解决方案

        var buildingInstructionsdata = []
        for (var i = 0; i < data.length; i++) {
            buildingInstructionsdata.push(createConstructionKit(data[i]))
        }
        

        【讨论】:

          【解决方案6】:

          这就是我最终开始工作的原因:

           function testing () {
            for (let i = 0; i < data.length; i++) {
             if (data[i].materials.length >2) {
              console.log(`${data[i].title} has ${data[i].materials.length} 
           materials:`);
              for (let j = 0; j < data[i].materials.length; j++) {
               const material = data[i].materials[j];
               console.log("- " + material);
                }
             }
             }
           }
          console.log(testing());
          

          【讨论】:

            猜你喜欢
            • 2012-04-30
            • 2016-03-04
            • 1970-01-01
            • 1970-01-01
            • 2021-11-05
            • 1970-01-01
            • 2021-01-29
            • 2022-01-08
            • 1970-01-01
            相关资源
            最近更新 更多