我创建了一个名为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);
还有更好的方法吗?
答案 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
- name
和birthDay
中有两个属性。对于你正在推动名字的每一个,因此有两个条目。
您不需要循环,因为只有一个名称。如果您正在使用数组,那么您可以循环使用它。
答案 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)
要获得此字符串,我认为您不需要数组。你可以尝试这样的事情:
对于将处理值的函数,您可以创建一个通用模式,该模式在标题大小写中返回值,后跟空格。有另一个功能,将有一个特殊处理的地图。这将使您的代码更易于配置。
我们的想法是将代码划分为更小的函数,以使其更具可重用性。在下面的代码中,
是通用函数,可以导出到实用程序文件。
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;