Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按属性对三个不同的对象数组进行排序_Javascript_Arrays_Typescript - Fatal编程技术网

Javascript 按属性对三个不同的对象数组进行排序

Javascript 按属性对三个不同的对象数组进行排序,javascript,arrays,typescript,Javascript,Arrays,Typescript,我有三个不同的对象数组,需要对日期字段进行排序,其中每个组中的字段都有不同的名称 下面是我的数据示例: const documents = [ { documentId: 'ADB0125A', fileName: 'test_2018.pdf', date': '2017-12-02T19:08:52+01:00' // Field to sort by }, { documentId: '123456', fileName: 'test2_2018.

我有三个不同的对象数组,需要对
日期
字段进行排序,其中每个组中的字段都有不同的名称

下面是我的数据示例:

const documents = [
{
    documentId: 'ADB0125A',
    fileName: 'test_2018.pdf',
    date': '2017-12-02T19:08:52+01:00'  // Field to sort by
},
{
    documentId: '123456',
    fileName: 'test2_2018.pdf',
    date': '2017-12-12T22:08:52+01:00'  // Field to sort by
},
{
    documentId: '121212',
    fileName: 'test3_2018.pdf',
    date': '2018-05-22T23:08:52+01:00'  // Field to sort by
}];

const conversations = [
{
    conversationId: '1102',
    lastUpdate: '2015-10-10T18:19:12+01:00'  // Field to sort by
},
{
    conversationId: '5622',
    lastUpdate: '2019-08-16T18:19:12+01:00'  // Field to sort by
},
{
    conversationId: '112',
    lastUpdate: '2015-10-26T18:19:12+01:00'  // Field to sort by
}];

const invoices = [
{
    invoiceId: "20100392077",
    rechnungsDatum: "2019-02-10"  // Field to sort by
},
{
    invoiceId: "5550392077",
    rechnungsDatum: "2018-02-05"  // Field to sort by
},
{
    invoiceId: "3336392077",
    rechnungsDatum: "2018-12-11"  // Field to sort by
}];
目标:返回最新的4个结果(我可以使用
.reverse()
在列出最后一组
ASC
后获得),独立于它们的来源。我希望得到:

const result = [
    {
        conversationId: '5622',
        lastUpdate: '2019-08-16T18:19:12+01:00'
    },
    {
        invoiceId: "20100392077",
        rechnungsDatum: "2019-02-10"
    },
    {
        invoiceId: "3336392077",
        rechnungsDatum: "2018-12-11"
    },
    {
        documentId: '121212',
        fileName: 'test3_2018.pdf',
        date': '2018-05-22T23:08:52+01:00'
    }
]

是否可以对所有三个对象使用唯一的
数组。排序
方法,或者唯一的方法是成对比较它们并根据部分结果生成结果?

您可以通过以下步骤执行此操作:

  • 首先使用嵌套的
    map()
    添加另一个属性,该属性的名称为
    ,其值将是需要对对象进行排序的值
  • 然后使用
    flat()
  • 然后根据我们在map中添加的键的值应用
    sort()
    ,然后应用
    sort()
const documents=[{documentId:'ADB0125A',fileName:'test_2018.pdf',date:'2017-12-02T19:08:52+01:00',{documentId:'123456',fileName:'test2_2018.pdf',date:'2017-12-12T22:08:52+01:00',{documentId:'121212',fileName:'test3_2018.pdf',date:'2018-05-22T23:08:52+01:00'];const conversations=[{conversationId:'1102',lastUpdate:'2015-10-10T18:19:12+01:00',{conversationId:'5622',lastUpdate:'2019-08-16T18:19:12+01:00',{conversationId:'112',lastUpdate:'2015-10-26T18:19:12+01:00}];施工发票=[{invoiceId:“20100392077”,rechnungsDatum:“2019-02-10”},{invoiceId:“5550392077”,rechnungsDatum:“2018-02-05”},{invoiceId:“3336392077”,rechnungsDatum:“2018-12-11”}];
让keys=['date','lastUpdate','rechnungsDatum'];
const res=[文件、对话、发票]
.map((x,i)=>x.map(a=>(
{…a,key:a[key[i]})
).flat()
.sort((a,b)=>a.key.localeCompare(b.key))
.slice(-4)
.reverse()
.map(({key,…rest})=>rest)

console.log(res)
您可以编写以下内容

const结果=[
{
会话ID:'5622',
最新更新:“2019-08-16T18:19:12+01:00”
},
{
发票ID:“20100392077”,
回复:“2019-02-10”
},
{
发票编号:“3336392077”,
回复:“2018-12-11”
},
{
documentId:'121212',
文件名:“test3_2018.pdf”,
日期:“2018-05-22T23:08:52+01:00”
}
]
let字段=[“日期”、“rechnungsDatum”、“lastUpdate”];
结果.排序((a,b)=>{
让dateA,dateB;
fields.forEach(字段=>{
如果(a.hasOwnProperty(字段))
dateA=新日期(a[字段]);
如果(b.hasOwnProperty(字段))
dateB=新日期(b[字段]);
});
返回日期a-日期b;});

log(result.reverse())您可以获取一个对象,该对象具有所需日期属性的replacemnt键和一个平面数组,该数组保留源属性和一个规范化的日期属性,对数组进行排序,并返回前四个元素

最后,删除不必要的信息并检索原始对象结构

const
documents=[{documentId:'ADB0125A',fileName:'test_2018.pdf',date:'2017-12-02T19:08:52+01:00'},{documentId:'123456',fileName:'test2_2018.pdf',date:'2017-12-12T22:08:52+01:00'},{documentId:'121212',fileName:'test3_2018.pdf',date 2018-05-22T23:08:52+01:00'},
conversations=[{conversationId:'1102',lastUpdate:'2015-10-10T18:19:12+01:00'},{conversationId:'5622',lastUpdate:'2019-08-16T18:19:12+01:00'},{conversationId:'112',lastUpdate:'2015-10-26T18:19:12+01:00'},
发票=[{invoiceId:“20100392077”,rechnungsDatum:“2019-02-10”},{invoiceId:“5550392077”,rechnungsDatum:“2018-02-05”},{invoiceId:“3336392077”,rechnungsDatum:“2018-12-11”}]
关键字={文档:'date',对话:'lastUpdate',发票:'rechnungsDatum'},
结果=对象
.条目({文档、对话、发票})
.reduce((r[k,v])=>[…r,…v.map(payload=>({payload,date:payload[keys[k]}]),[]))
.sort((a,b)=>b.date.localeCompare(a.date))
.slice(0,4)
.map(({payload})=>有效载荷);
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
您可以向所有数组中的每个对象添加一个
sortBy
字段。然后合并对象数组并根据自定义字段进行排序。获得前4名的结果。然后通过
列删除
排序:

const documents=[{documentId:'ADB0125A',文件名:'test_2018.pdf',日期:'2017-12-02T19:08:52+01:00'},{documentId:'123456',文件名:'test2_2018.pdf',日期:'2017-12-12T22:08:52+01:00'},{documentId:'121212',文件名:'test3_2018.pdf',日期:'2018-05-22T23:08:52+01:00'},
conversations=[{conversationId:'1102',lastUpdate:'2015-10-10T18:19:12+01:00'},{conversationId:'5622',lastUpdate:'2019-08-16T18:19:12+01:00'},{conversationId:'112',lastUpdate:'2015-10-26T18:19:12+01:00'},
发票=[{invoiceId:“20100392077”,rechnungsDatum:“2019-02-10”},{invoiceId:“5550392077”,rechnungsDatum:“2018-02-05”},{invoiceId:“3336392077”,rechnungsDatum:“2018-12-11”}];
const addSortBy=(arr,sortBy)=>arr.map(a=>({…a,sortBy:new Date(a[sortBy])),
takeCount=4;//输出中需要的项目数
//所有对象都有一个要排序的字段的额外键
const merged=[…addSortBy(文件,“日期”),
…通过(对话,“最新更新”),
…通过(发票)添加,回复