Javascript 按对象名称Typescript对对象数组进行排序
使用TypeScript,我试图按照实际对象的名称而不是对象键对对象数组进行排序。这些对象上也存在与实际对象同名的名称键。我想看看我的逻辑哪里出了问题。我尝试按对象的名称键进行排序,但没有成功 我尝试过以多种方式使用.sort()函数 示例数组如下所示:Javascript 按对象名称Typescript对对象数组进行排序,javascript,arrays,typescript,object,Javascript,Arrays,Typescript,Object,使用TypeScript,我试图按照实际对象的名称而不是对象键对对象数组进行排序。这些对象上也存在与实际对象同名的名称键。我想看看我的逻辑哪里出了问题。我尝试按对象的名称键进行排序,但没有成功 我尝试过以多种方式使用.sort()函数 示例数组如下所示: templateReports = [ {"Project Report": {name: "Project Report", docType: "Project"}}, {"Department Report": {name: "Depar
templateReports = [
{"Project Report": {name: "Project Report", docType: "Project"}},
{"Department Report": {name: "Department Report", docType: "Department"}},
{"Room Report": {name: "Room Report", docType: "Room"}}
]
我尝试了以下方法:
templateReports.sort((a,b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0));
我知道这不起作用,因为要调用数组中的first name键,我可以执行以下操作:
console.log(templateReports[0]["Project Report"].name);
templateReports.sort((a,b) => (a[nameOfObject].name > b[nameOfNextObject].name) ? 1 : ((b[nameOfNextObject].name > a[nameOfObject].name) ? -1 : 0));
o["Project Report"].name // => "Project Report"
这将得到数组中第一个对象的名称值。因此,我知道我必须修改使用源函数的方式,使其类似于:
console.log(templateReports[0]["Project Report"].name);
templateReports.sort((a,b) => (a[nameOfObject].name > b[nameOfNextObject].name) ? 1 : ((b[nameOfNextObject].name > a[nameOfObject].name) ? -1 : 0));
o["Project Report"].name // => "Project Report"
我正试着让它按字母顺序排列成:
templateReports = [
{"Department Report": {name: "Department Report", docType: "Department"}},
{"Project Report": {name: "Project Report", docType: "Project"}},
{"Room Report": {name: "Room Report", docType: "Room"}}
]
我如何a)使用sort方法完成这项工作,或者b)根据对象的实际名称进行排序
谢谢。要回答您的问题,您可以通过调用获取第一个可枚举密钥的
object.keys(obj)[0]
来获取对象密钥。因为这些对象中的每一个都只有一个键值对,所以这将很好地工作。如果添加第二个键值对,这将不起作用
那么,我的下一个问题是,为什么对象首先处于这种配置中?考虑到对象键只是重复的
名称
值,我认为只有对象数组才更有意义,不是吗?我不确定将每个对象嵌套在第二个对象中会带来什么好处。要回答您的问题,可以通过调用获取第一个可枚举键的object.keys(obj)[0]
来获取对象键。因为这些对象中的每一个都只有一个键值对,所以这将很好地工作。如果添加第二个键值对,这将不起作用
那么,我的下一个问题是,为什么对象首先处于这种配置中?考虑到对象键只是重复的
名称
值,我认为只有对象数组才更有意义,不是吗?我不确定将每个对象嵌套在第二个对象中会带来什么好处。如果有这样的对象:
let o = {"Project Report": {name: "Project Report", docType: "Project"}}
function getName(o) {
return Object.keys(o)[0];
}
templateReports.sort((first, second) => getName(first).localeCompare(getName(second)));
第一个字符串是属性名。
i、 e要获得值,您必须编写以下内容:
console.log(templateReports[0]["Project Report"].name);
templateReports.sort((a,b) => (a[nameOfObject].name > b[nameOfNextObject].name) ? 1 : ((b[nameOfNextObject].name > a[nameOfObject].name) ? -1 : 0));
o["Project Report"].name // => "Project Report"
这给您带来了一个问题,因为您事先不知道要排序的对象中唯一键的名称
但是您可以使用object.keys()
,向对象请求其密钥:
既然您知道列表中每个对象只有一个键,您可以这样写:
let o = {"Project Report": {name: "Project Report", docType: "Project"}}
function getName(o) {
return Object.keys(o)[0];
}
templateReports.sort((first, second) => getName(first).localeCompare(getName(second)));
当您有这样一个对象时:
let o = {"Project Report": {name: "Project Report", docType: "Project"}}
function getName(o) {
return Object.keys(o)[0];
}
templateReports.sort((first, second) => getName(first).localeCompare(getName(second)));
第一个字符串是属性名。
i、 e要获得值,您必须编写以下内容:
console.log(templateReports[0]["Project Report"].name);
templateReports.sort((a,b) => (a[nameOfObject].name > b[nameOfNextObject].name) ? 1 : ((b[nameOfNextObject].name > a[nameOfObject].name) ? -1 : 0));
o["Project Report"].name // => "Project Report"
这给您带来了一个问题,因为您事先不知道要排序的对象中唯一键的名称
但是您可以使用object.keys()
,向对象请求其密钥:
既然您知道列表中每个对象只有一个键,您可以这样写:
let o = {"Project Report": {name: "Project Report", docType: "Project"}}
function getName(o) {
return Object.keys(o)[0];
}
templateReports.sort((first, second) => getName(first).localeCompare(getName(second)));
这是一个奇怪的对象结构 您可以这样做,但是您需要弄清楚属性的访问器应该是什么。如何定义每个对象的此键 您可以使用对象中的第一个键:(免责声明-这是可维护的吗?
const accessortingkey(object:object):字符串{
const key=Object.keys(Object)[0];
返回键;
}
常量古怪数组=[
{“项目报告”:{name:“项目报告”,docType:“项目”},
{“部门报告”:{名称:“部门报告”,docType:“部门”},
{“房间报告”:{name:“房间报告”,docType:“房间”}
];
古怪数组.排序((a,b)=>{
const aVal=accessortingkey(a);
const bVal=访问排序键(b);
返回aVal>bVal?1:aVal
})) 这是一个奇怪的对象结构 您可以这样做,但是您需要弄清楚属性的访问器应该是什么。如何定义每个对象的此键 您可以使用对象中的第一个键:(免责声明-这是可维护的吗?
const accessortingkey(object:object):字符串{
const key=Object.keys(Object)[0];
返回键;
}
常量古怪数组=[
{“项目报告”:{name:“项目报告”,docType:“项目”},
{“部门报告”:{名称:“部门报告”,docType:“部门”},
{“房间报告”:{name:“房间报告”,docType:“房间”}
];
古怪数组.排序((a,b)=>{
const aVal=accessortingkey(a);
const bVal=访问排序键(b);
返回aVal>bVal?1:aVal
})) 请发布您想要得到的结果。我通过以下操作实现了这一点:
this.templaterreports.sort((a,b)=>(Object.keys(a)[0]>Object.keys(b)[0])?1:((Object.keys(b)[0]>Object.keys(a)[0])?-1:0))代码>请发布您想要得到的结果。我通过以下操作实现了这一点:this.templaterreports.sort((a,b)=>(Object.keys(a)[0]>Object.keys(b)[0])?1:((Object.keys(b)[0]>Object.keys(a)[0])?-1:0)代码>