我在JS中有以下对象:
var obj = {
elem_1: "el1",
elem_2: "el2",
elem_3: "el3",
exp_1: "ex1",
exp_2: "ex2",
exp_3: "ex3"
};
我正在尝试对其重新排序,以便每个elem_#
后跟exp_#
。
我启动了以下代码,但不确定如何实现:
obj.sort(function (index, data) {
return data.key.split('_')[1] == '1' ? 2 : data.key == '2' ? 1 : 0
});
我该如何实现自己的目标。
答案 0 :(得分:3)
您可以通过依次Object.getOwnPropertyNames()
,split()
,然后.sort()
来获取密钥。
然后我使用.reduce()
将它们变回一个对象。 Reduce遍历数组的所有值以产生单个输出。在这种情况下,输出为acc
(“累加器”的缩写)-每次迭代,我都通过获取现有内容(acc
)将其属性添加到...acc
并将其与我们的新资源([item]: obj[item]
)。 ...acc
语法正在使用spread syntax for object literals。第二个参数(在下面的示例中仅为{}
)是acc
的初始值。
请注意,对象的属性顺序直到最近才在JavaScript中得到保证(仅ES2015 +,非整数属性名称)。就我个人而言,我仍然认为依靠它们的顺序会有轻微的气味。
var obj = {
elem_1: "el1",
elem_2: "el2",
elem_3: "el3",
exp_1: "ex1",
exp_2: "ex2",
exp_3: "ex3"
};
var res = Object.getOwnPropertyNames(obj)
.sort((a,b) => a.split("_")[1] - b.split("_")[1])
.reduce((acc,item) => ({...acc, [item]: obj[item]}), {});
console.log(res);
编辑:对于this link(由wlh在上面的注释中提到),如果处理财产顺序,则Object.getOwnPropertyNames()
比Object.keys()
更好。
答案 1 :(得分:1)
一种方法
获取键并sort
,然后再返回map
以所需的形式获取对象。
var obj = {
elem_1: "el1",
elem_2: "el2",
elem_3: "el3",
exp_1: "ex1",
exp_2: "ex2",
exp_3: "ex3"
};
let op = Object.keys(obj)
.sort((a,b)=> a.split('_')[1] - b.split('_')[1])
.map(e=> ({[e]: obj[e]}) )
console.log(op)
P.S:-这是假设您的输入将始终按照示例的定义形式进行。
答案 2 :(得分:0)
那
var obj = {
elem_1: "el1",
elem_2: "el2",
elem_3: "el3",
exp_1: "ex1",
exp_2: "ex2",
exp_3: "ex3"
}
obj = Object.entries(obj).sort((a, b) => a[0].split('_')[1]-b[0].split('_')[1])
.map(([key, val]) => ([key, val]))
.reduce((obj, [k, v]) => Object.assign(obj, { [k]: v }), {})
console.log(obj)
答案 3 :(得分:0)
您可以拆分键,并以所需对象的顺序按数字和字符串排序。以后重建一个新对象。
var object = { elem_1: "el1", elem_2: "el2", elem_3: "el3", exp_1: "ex1", exp_2: "ex2", exp_3: "ex3" },
order = { elem: 1, exp: 2 };
object = Object.assign(...Object
.entries(object)
.sort(([a], [b]) => {
var aa = a.split('_'),
bb = b.split('_');
return aa[1] - bb[1] || order[aa[0]] - order[bb[0]];
})
.map(([k, v]) => ({ [k]: v }))
);
console.log(object);