如何根据部分键值匹配对JS对象重新排序

时间:2019-01-11 18:13:59

标签: javascript object

我在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 
});

我该如何实现自己的目标。

4 个答案:

答案 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);