Javascript 如何基于部分键值匹配对JS对象重新排序

Javascript 如何基于部分键值匹配对JS对象重新排序,javascript,object,Javascript,Object,我在JS中有以下对象: var obj = { elem_1: "el1", elem_2: "el2", elem_3: "el3", exp_1: "ex1", exp_2: "ex2", exp_3: "ex3" }; 我正在尝试重新排序,以便每个元素后面都跟有exp 我启动了以下代码,但不确定如何实现: obj.sort(function (index, data) { return data.key.split('_')[1] == '1' ? 2

我在JS中有以下对象:

var obj = {
  elem_1: "el1",
  elem_2: "el2",
  elem_3: "el3",
  exp_1: "ex1",
  exp_2: "ex2",
  exp_3: "ex3"
};
我正在尝试重新排序,以便每个元素后面都跟有exp

我启动了以下代码,但不确定如何实现:

obj.sort(function (index, data) { 
    return data.key.split('_')[1] == '1' ? 2 : data.key == '2' ? 1 : 0 
});

如何实现我希望完成的任务。

您可以通过执行Object.getOwnPropertyNames、拆分它们,然后对它们进行排序来获取密钥

然后我使用.reduce将它们转换回一个对象。Reduce遍历数组的所有值以生成单个输出。在本例中,输出是acc(累加器的缩写)-在每次迭代中,我通过获取现有内容…acc并将其与新属性[item]:obj[item]组合,将属性添加到acc中。acc语法正在使用。下面示例中的第二个参数{}是acc的初始值

需要注意的是,对象中的属性顺序直到最近才在JavaScript ES2015+中得到保证,仅限非整数属性名。就我个人而言,我仍然认为依赖他们的订单是一种轻微的气味。 var obj={ 要素1:el1, ELM_2:el2, ELM_3:el3, exp_1:ex1, exp_2:ex2, 实验3:实验3 }; var res=Object.getOwnPropertyNamesobj .sorta,b=>a.split\uu1]-b.split\u1] .reduceAc,item=>{…acc,[item]:obj[item]},{};
console.logres 您可以通过执行Object.getOwnPropertyNames、拆分键,然后对键进行排序来获取键

然后我使用.reduce将它们转换回一个对象。Reduce遍历数组的所有值以生成单个输出。在本例中,输出是acc(累加器的缩写)-在每次迭代中,我通过获取现有内容…acc并将其与新属性[item]:obj[item]组合,将属性添加到acc中。acc语法正在使用。下面示例中的第二个参数{}是acc的初始值

需要注意的是,对象中的属性顺序直到最近才在JavaScript ES2015+中得到保证,仅限非整数属性名。就我个人而言,我仍然认为依赖他们的订单是一种轻微的气味。 var obj={ 要素1:el1, ELM_2:el2, ELM_3:el3, exp_1:ex1, exp_2:ex2, 实验3:实验3 }; var res=Object.getOwnPropertyNamesobj .sorta,b=>a.split\uu1]-b.split\u1] .reduceAc,item=>{…acc,[item]:obj[item]},{}; console.logres 这样做的一种方法

获取键并对其进行排序,然后映射回所需形式的对象

var obj={ 要素1:el1, ELM_2:el2, ELM_3:el3, exp_1:ex1, exp_2:ex2, 实验3:实验3 }; 设op=Object.keysobj .sorta,b=>a.split'[1]-b.split'[1] .mape=>{[e]:obj[e]} console.logop执行此操作的一种方法

获取键并对其进行排序,然后映射回所需形式的对象

var obj={ 要素1:el1, ELM_2:el2, ELM_3:el3, exp_1:ex1, exp_2:ex2, 实验3:实验3 }; 设op=Object.keysobj .sorta,b=>a.split'[1]-b.split'[1] .mape=>{[e]:obj[e]} 控制台。logop怎么办

var obj={ 要素1:el1, ELM_2:el2, ELM_3:el3, exp_1:ex1, exp_2:ex2, 实验3:实验3 } obj=Object.entriesobj.sorta,b=>a[0]。拆分'''[1]-b[0]。拆分'[1] .map[key,val]=>[key,val] .reduceobj[k,v]=>Object.assignobj,{[k]:v},{} console.logobj

var obj={ 要素1:el1, ELM_2:el2, ELM_3:el3, exp_1:ex1, exp_2:ex2, 实验3:实验3 } obj=Object.entriesobj.sorta,b=>a[0]。拆分'''[1]-b[0]。拆分'[1] .map[key,val]=>[key,val] .reduceobj[k,v]=>Object.assignobj,{[k]:v},{}
logobj您可以拆分键,并通过获取一个对象来按所需顺序按数字和字符串排序。稍后重新生成一个新对象

var object={elem_1:el1,elem_2:el2,elem_3:el3,exp_1:ex1,exp_2:ex2,exp_3:ex3}, 顺序={elem:1,exp:2}; 对象=对象。分配…对象 .entriesobject .排序[a],[b]=>{ var aa=a.拆分, bb=b.分割; 返回aa[1]-bb[1]|订单[aa[0]]-订单[bb[0]]; } .map[k,v]=>{[k]:v} ;
console.logobject 您可以拆分键,并按所需顺序按数字和字符串排序,方法是将对象作为顺序。稍后重新生成一个新对象

var object={elem_1:el1,elem_2:el2,elem_3:el3,exp_1:ex1,exp_2:ex2,exp_3:ex3}, 顺序={elem:1,exp:2}; 对象=对象。分配…对象 .entriesobject .排序[a],[b]=>{ var aa=a.拆分, bb=b.分割; 返回aa[1]-bb[1]|订单[aa[0]]-订单[bb[0]]; } .map[k,v]=>{[k]:v} ;
console.logobject;您必须删除属性并将其读取到对象以保持顺序。如果顺序很重要,请使用支持它的结构,如数组。不幸的是,我只能使用对象。我试着把一个数组转换成一个对象,所有的东西都不合适。你不能对一个对象进行排序,使用一个对象数组,也许要记住:哟
您必须删除属性并将其读取到对象以保持顺序。如果顺序很重要,请使用支持它的结构,如数组。不幸的是,我只能使用对象。我试着把一个数组转换成一个对象所有的东西都不合适。你不能对一个对象进行排序,使用一个对象数组,也许要记住:谢谢。是的,如果有一个数字,它将始终结束。但是它会失败,假设数字是两位数。。。我认为泰勒提到的分裂是失败的最好例子。是的,如果有一个数字,它将始终结束。但是它会失败,假设数字是两位数。。。我认为泰勒提到的分裂是失败的更好例子。什么是…acc?好问题。我将在我的答案中添加一些细节,以便更深入地解释。@Si8这将有助于…acc AHHHHH现在有意义了。。。谢谢你的链接,也谢谢你clarification@Si8我在回答中澄清了:什么是……acc?好问题。我将在我的答案中添加一些细节,以便更深入地解释。@Si8这将有助于…acc AHHHHH现在有意义了。。。谢谢你的链接,也谢谢你clarification@Si8我在回答中已经澄清: