Javascript 按复合键对 obj 进行排序

我有一个这样定义的对象:


{

        _id: "5d406a171ed43384972f04b5",

        index: 0,

        age: 28,

        eyeColor: "brown",

        name: {

          first: "Myra",

          last: "Navarro"

        },

        company: "SUSTENZA",

        email: "myra.navarro@sustenza.net"

      }

我需要能够对所有键进行搜索,即使是像name.


例如,我有一个搜索字符串name.first等,它可能是更深层次的复合对象。


我设法做到了这一点,但例如name.first我无法让它发挥作用。


你能帮我个忙吗?


绝地无双
浏览 78回答 3
3回答

梦里花落0921

第一个问题是 javascript 不会自动使用点访问子项。接下来,一旦你有了想要比较的值。如果值是字符串,则需要使用特殊的字符串比较函数(使用 typeof 进行检查)。或者使用 valA - valB 以便获得 1、0 和 -1 作为用于排序的返回值。

Qyouu

我希望这就是您所需要的。该child功能可以满足您的需求。你在评论里有解释。let datatable = [  {    _id: "5d406a171ed43384972f04b5",    index: 0,    age: 28,    eyeColor: "brown",    name: {      first: "Myra",      last: "Navarro"    },    company: "SUSTENZA",    email: "myra.navarro@sustenza.net"  },  {    _id: "5d406a170db0f4b04d9a9acf",    index: 1,    age: 23,    eyeColor: "blue",    name: {      first: "Harriett",      last: "Tanner"    },    company: "VALPREAL",    email: "harriett.tanner@valpreal.com"  },  {    _id: "5d406a17e95da8ff80a759c5",    index: 2,    age: 39,    eyeColor: "blue",    name: {      first: "Vega",      last: "Hanson"    },    company: "BEDLAM",    email: "vega.hanson@bedlam.tv"  },  {    _id: "5d406a175505da190e6875ec",    index: 3,    age: 31,    eyeColor: "blue",    name: {      first: "Rosemary",      last: "Fields"    },    company: "QUAILCOM",    email: "rosemary.fields@quailcom.me"  },  {    _id: "5d406a17ea96044c027f4e50",    index: 4,    age: 27,    eyeColor: "brown",    name: {      first: "Dale",      last: "Wilkinson"    },    company: "QIAO",    email: "dale.wilkinson@qiao.org"  },  {    _id: "5d406a17c5fff1ff6653a555",    index: 5,    age: 25,    eyeColor: "blue",    name: {      first: "Beatrice",      last: "Contreras"    },    company: "ZENOLUX",    email: "beatrice.contreras@zenolux.us"  },  {    _id: "5d406a17a199efcba25e1f26",    index: 6,    age: 34,    eyeColor: "blue",    name: {      first: "Hancock",      last: "Wynn"    },    company: "PLASMOS",    email: "hancock.wynn@plasmos.co.uk"  },  {    _id: "5d406a17019a2a4544a4f134",    index: 7,    age: 40,    eyeColor: "blue",    name: {      first: "Brown",      last: "Stanton"    },    company: "SNACKTION",    email: "brown.stanton@snacktion.name"  },  {    _id: "5d406a17e516dd71af8210d4",    index: 8,    age: 39,    eyeColor: "blue",    name: {      first: "Barnes",      last: "Dunn"    },    company: "PORTALINE",    email: "barnes.dunn@portaline.ca"  },  {    _id: "5d406a17516936a025b73c33",    index: 9,    age: 34,    eyeColor: "green",    name: {      first: "Blanche",      last: "Cherry"    },    company: "ISOSWITCH",    email: "blanche.cherry@isoswitch.io"  },  {    _id: "5d406a17527a4d2c6a7897dd",    index: 10,    age: 33,    eyeColor: "blue",    name: {      first: "Gilliam",      last: "Farley"    },    company: "AMTAS",    email: "gilliam.farley@amtas.biz"  },  {    _id: "5d406a175ff11478c416c30b",    index: 11,    age: 26,    eyeColor: "brown",    name: {      first: "Laura",      last: "Short"    },    company: "FISHLAND",    email: "laura.short@fishland.info"  },  {    _id: "5d406a1738181b471847339a",    index: 12,    age: 20,    eyeColor: "brown",    name: {      first: "Moreno",      last: "Barber"    },    company: "KEENGEN",    email: "moreno.barber@keengen.net"  },  {    _id: "5d406a17a6bcae6fe3ad1735",    index: 13,    age: 30,    eyeColor: "brown",    name: {      first: "Fischer",      last: "French"    },    company: "INCUBUS",    email: "fischer.french@incubus.com"  },  {    _id: "5d406a17600ca53e8f63f263",    index: 14,    age: 30,    eyeColor: "brown",    name: {      first: "Donaldson",      last: "Carr"    },    company: "SUNCLIPSE",    email: "donaldson.carr@sunclipse.tv"  },  {    _id: "5d406a17530655789a27174f",    index: 15,    age: 35,    eyeColor: "green",    name: {      first: "Sophia",      last: "Payne"    },    company: "PRISMATIC",    email: "sophia.payne@prismatic.me"  },  {    _id: "5d406a175dbc687b4c7669d8",    index: 16,    age: 34,    eyeColor: "green",    name: {      first: "Simone",      last: "Pollard"    },    company: "DIGIGEN",    email: "simone.pollard@digigen.org"  },  {    _id: "5d406a179f35ed326a6a5567",    index: 17,    age: 28,    eyeColor: "green",    name: {      first: "Yvette",      last: "Daugherty"    },    company: "CHILLIUM",    email: "yvette.daugherty@chillium.us"  }];const sortAsc = true;const sortField = "name.first";//index,eyeColorvar result = datatable.sort((a, b) => {  let [x, z] = sortAsc ? [a, b] : [b, a];  //console.log(x[sortField], z[sortField], x[sortField] > z[sortField] ? 1 : -1);  //return x[sortField] > z[sortField] ? 1 : -1;  return child(x, sortField) > child(z, sortField) ? 1: -1;});console.log(result);function child(obj, str){  //take dot-separated chain of properties' names and split them into an array  const props = str.split('.');  let child = obj;  //looop through all properties' names and get the access to the following [Object] children sequentially  props.forEach((prop)=> child = child[prop]);  return child;}

30秒到达战场

选项1:const objRoute = sortField.split(".");const getValue = obj => objRoute.reduce((v, c) => v[c], obj);const result = datatable.sort((a, b) =>  sortAsc    ? getValue(a).localeCompare() - getValue(b).localeCompare()    : getValue(b).localeCompare() - getValue(a).localeCompare());选项2:使用 eval,eval() 计算表达式。建议谨慎使用该功能:const result = datatable.sort((a, b, i) => eval(`a.${sortField}`) - eval(`b.${sortField}`));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript