Jea*_*hel 7 javascript oop node.js
你能帮我解答疑惑吗?
我正在尝试一种在 JS 中更教化的方法,为模型类创建一个 POJO/POCO。
我有一个 Person 对象:
function person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
return this;
}
Run Code Online (Sandbox Code Playgroud)
现在我可以创建一些数据:
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"));
Run Code Online (Sandbox Code Playgroud)
好吧,如果我调用 sort 方法就完成了,没有操作来排序这些数据:
personalities.sort();
for(var i = 0; i < personalities.length; i++)
console.log(personalities[i].name);
Run Code Online (Sandbox Code Playgroud)
输出是:
Alicia
Bartolomeu Simpson
Ayrton Senna
Jean J. Michel
Jean J. Michel
Run Code Online (Sandbox Code Playgroud)
我创建了一个 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;
}
Run Code Online (Sandbox Code Playgroud)
现在排序方法“ok”了,现在的输出是:
Alicia
Ayrton Senna
Bartolomeu Simpson
Jean J. Michel
Jean J. Michel
Run Code Online (Sandbox Code Playgroud)
但我想做一些不同的事情,按姓名和年龄排序(最老的在前)。我实现了方法 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;
}
Run Code Online (Sandbox Code Playgroud)
方法还行,看看吧:
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
Run Code Online (Sandbox Code Playgroud)
我可以使用这种方法对我的数组进行排序吗?像这样的东西:
personalities.sort(person.compareTo);
Run Code Online (Sandbox Code Playgroud)
我真的不想在使用我的模型的服务类中这样做:
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;
});
Run Code Online (Sandbox Code Playgroud)
我认为这是模范责任。
感谢所有帮助。
好吧,您传递给的比较器函数sort()需要带两个参数,因此它不能是实例方法。我建议您将其定义为“静态”方法:
function person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
person.compare = function(personA, personB) {
if(personA.name > personB.name) return 1;
if(personA.name < personB.name) return -1;
return personB.age - personA.age;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在排序时调用它:
personalities.sort(person.compare);
Run Code Online (Sandbox Code Playgroud)
我希望我能正确理解你在问什么。