为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript 按复合键对 obj 进行排序

Javascript 按复合键对 obj 进行排序

绝地无双 2023-09-28 16:51:53
我有一个这样定义的对象:{        _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我无法让它发挥作用。你能帮我个忙吗?
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超5个赞

第一个问题是 javascript 不会自动使用点访问子项。

接下来,一旦你有了想要比较的值。

如果值是字符串,则需要使用特殊的字符串比较函数(使用 typeof 进行检查)。或者使用 valA - valB 以便获得 1、0 和 -1 作为用于排序的返回值。


查看完整回答
反对 回复 2023-09-28
?
Qyouu

TA贡献1786条经验 获得超11个赞

我希望这就是您所需要的。该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,eyeColor


var 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;

}


查看完整回答
反对 回复 2023-09-28
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

选项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}`));



查看完整回答
反对 回复 2023-09-28
  • 3 回答
  • 0 关注
  • 49 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信