【发布时间】:2018-09-12 18:56:11
【问题描述】:
你能帮我解决一个问题吗?
我正在尝试一种在 JS 中更具指导性的方法,为模型类创建 POJO/POCO。
我有一个 Person 对象:
function person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
return this;
}
现在我可以创建一些数据了:
var personalities = new Array(new person("Alicia", 152, "F"),
new person("Bartolomeu Simpson", 36, "M"),
new person("Ayrton Senna", 58, "M"),
new person("Jean J. Michel", 36, "M"),
new person("Jean J. Michel", 37, "M"));
好吧,如果我调用 sort 方法就可以了,没有任何动作来排序这些数据:
personalities.sort();
for(var i = 0; i < personalities.length; i++)
console.log(personalities[i].name);
输出是:
Alicia
Bartolomeu Simpson
Ayrton Senna
Jean J. Michel
Jean J. Michel
我创建了一个 toString() 方法:
function person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
this.toString = function() {
return this.name + " " +
this.age + " years old" +
(this.gender == 'M' ? " man" : " woman");
};
return this;
}
现在排序方法是“ok”,现在的输出是:
Alicia
Ayrton Senna
Bartolomeu Simpson
Jean J. Michel
Jean J. Michel
但我想做一些不同的事情,按姓名和年龄排序(从大到小)。我实现了方法 compareTo(obj):
function person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
this.toString = function() {
return this.name + " " +
this.age + " years old" +
(this.gender == 'M' ? " man" : " woman");
};
this.compareTo = function(otherPerson) {
var resultOfComparison = 0;
if(this.name > otherPerson.name) {
resultOfComparison = 1;
return resultOfComparison;
}
else if(this.name < otherPerson.name) {
resultOfComparison = -1;
return resultOfComparison;
}
else if(this.age > otherPerson.age) {
resultOfComparison = -1;
return resultOfComparison;
}
else if(this.age < otherPerson.age) {
resultOfComparison = 1;
return resultOfComparison;
}
return resultOfComparison;
};
return this;
}
方法还可以,看看吧:
var jean1 = new person("Jean J. Michel", 36, "M");
var jean2 = new person("Jean J. Michel", 37, "M");
console.log(jean1.compareTo(jean2)); //1
console.log(jean1.compareTo(jean1)); //0
console.log(jean2.compareTo(jean1)); //-1
我可以使用这种方法对数组进行排序吗?像这样的:
personalities.sort(person.compareTo);
我真的不想在使用我的模型的服务类中这样做:
personalities.sort(function(personA, personB) {
var resultOfComparison = 0;
if(personA.name > personB.name) {
resultOfComparison = 1;
return resultOfComparison;
}
else if(personA.name < personB.name) {
resultOfComparison = -1;
return resultOfComparison;
}
else if(personA.age > personB.age) {
resultOfComparison = -1;
return resultOfComparison;
}
else if(personA.age < personB.age) {
resultOfComparison = 1;
return resultOfComparison;
}
return resultOfComparison;
});
我认为这是一种模范责任。
感谢大家的帮助。
【问题讨论】:
-
为什么不传递
.sort()一个只返回personA.compareTo(personB)的小函数? -
怎么做?你能给我指路吗?
-
personalities.sort((personA, personB) => personA.compareTo(personB));
标签: javascript node.js oop