数组正在推动两次元素

时间:2017-09-07 23:17:49

标签: javascript arrays

我创建了一个名为printPeople的函数。这将打印人物的对象名称及其生日,并使用适当的字符大小写:"Sola Kiviston: November 31, 1761"

一旦这样做,我注意到当我将它们推到myNewArray时,它实际上使数组加倍:['Sola', 'Kiviston', 'November', 'Sola', 'Kiviston', 'November']我不知道发生了什么。知道是什么导致了这个吗?

function printPeople(people){
    var result =  [];

    // Retrieve information from <people>.
    for(var prop in people){
        result.push(
            people.name.first.toLowerCase().split(' '), 
            people.name.last.toLowerCase().split(' '), 
            people.birthDay.month.toLowerCase().split(' ')
        );
    };

    // Capitalize each first letter of each word.
    var myNewArray = [].concat.apply([], result);
    for(var i = 0; i < myNewArray.length; i++){
        myNewArray[i] = myNewArray[i][0].toUpperCase() 
                      + myNewArray[i].slice(1);
    }

    // Output the result : "Sola Kiviston: November 31, 1761"
    return myNewArray[0] + ' ' 
        + myNewArray[1] + ': ' 
        + myNewArray[2] + ' ' 
        + people.birthDay.day + ', ' 
        + people.birthDay.year;
};

var people= {
    name: {
        first: "SolA",
        last: "kiViSton"
    },
    birthDay: {
        month: "NovembeR",
        day: 31,
        year: 1761
    }
};

var output = printPeople(people); //"Sola Kiviston: November 31, 1761"
console.log(output);

还有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

for(var prop in people){
    result.push(people.name.first.toLowerCase().split(' '), people.name.last.toLowerCase().split(' '), people.birthDay.month.toLowerCase().split(' '));
}

people - namebirthDay中有两个属性。对于你正在推动名字的每一个,因此有两个条目。

您不需要循环,因为只有一个名称。如果您正在使用数组,那么您可以循环使用它。

答案 1 :(得分:0)

小心这些界限:

for(var prop in people){
    result.push( something, something, something );
}

你正在result中逐个推动每件作品。你想要的是:

var entry = people.name.first.toLowerCase().split(' ') + " "
          + people.name.last.toLowerCase().split(' ') + ": "
          + people.name.bithday.month.toLowerCase().split(' ');
          + "etc."

// Now you add all of it together.
result.push( entry );

您不需要超过此代码。

[编辑]

我的坏,我明白你的意思。 所以非常简单。你觉得这有点太复杂了。你可以这样做:

function printPeople( people ) {
    return people.getFullName() + ": " + people.getBirthday();
}

var people= {
    name: {
        first: "SolA",
        last: "kiViSton"
    },
    birthDay: {
        month: "NovembeR",
        day: 31,
        year: 1761
    },
    getFullName: function() {
        return (this.name.first + " " + this.name.last).toLowerCase();
	},
    getBirthday: function() {
        var _b = this.birthDay; // Alias.
        return (_b.month + " " + _b.day + ", " + _b.year).toLowerCase();
    }
};

console.log( printPeople( people ) ); //"Sola Kiviston: November 31, 1761"

如您所见,您不需要任何数组,因为您只需要构建一个字符串并将其返回。

  • 我还在people对象中添加了方法,因此它可以做一些有用的操作
  • 您可以执行("string1" + "string2" + "string3").toLowerCase()之类的操作。这样,您每次都不需要致电toLowerCase()
  • 现在,printPeople()功能变得非常简单。将代码分成较小的部分是一种很好的做法。这使您的代码更加干净和可读! :)

希望这有帮助!

答案 2 :(得分:0)

要获得此字符串,我认为您不需要数组。你可以尝试这样的事情:

逻辑:

  • 创建一个接受2个参数的通用函数:
    1. 要处理的对象
    2. 具有字符串处理逻辑的回调函数。
  • 现在在这个函数中,遍历这个对象并检查当前值是否也是object类型,然后递归地处理这个对象。

对于将处理值的函数,您可以创建一个通用模式,该模式在标题大小写中返回值,后跟空格。有另一个功能,将有一个特殊处理的地图。这将使您的代码更易于配置。

我们的想法是将代码划分为更小的函数,以使其更具可重用性。在下面的代码中,

  • toTitleCase
  • printObject

是通用函数,可以导出到实用程序文件。

&#13;
&#13;
function printObject(obj, processValue) {
  var str = '';
  for (var key in obj) {
    str += (typeof obj[key] === 'object') ? 
              printObject(obj[key], processValue) :
              processValue(obj, key)
  }
  return str;
};

function processValue(obj, key) {
  return toTitleCase(obj[key]) + getSpecialHandling(key) + ' '
}

function toTitleCase(str) {
  str = str.toString();
  return str.charAt(0).toUpperCase() + str.substr(1).toLowerCase();
}

function getSpecialHandling(key) {
  var specialHandling = {
    last: ':',
    month: ','
  }
  return specialHandling[key] || '';
}

var people = {
  name: {
    first: "SolA",
    last: "kiViSton"
  },
  birthDay: {
    month: "NovembeR",
    day: 31,
    year: 1761
  }
};

var output = printObject(people, processValue); //"Sola Kiviston: November 31, 1761"
console.log(output);
&#13;
&#13;
&#13;