Как изменить порядок объектов JS на основе частичного совпадения значения ключа - PullRequest
0 голосов
/ 11 января 2019

У меня есть следующий объект в 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 голосов
/ 11 января 2019

Вы можете разделить ключи и отсортировать по номеру и строке в требуемом порядке, взяв объект для заказа. Позже восстановите новый объект.

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);
0 голосов
/ 11 января 2019

Один из способов сделать это

Возьмите ключи и 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 .: - Это предполагает, что ваш ввод всегда будет в определенной форме, как в вашем примере.

0 голосов
/ 11 января 2019

А как же

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)
0 голосов
/ 11 января 2019

Вы можете получить ключи, набрав Object.getOwnPropertyNames(), split() их, а затем .sort() их.

Затем я использую .reduce(), чтобы превратить их обратно в объект. Сокращает итерации по всем значениям массива для получения одного вывода. В этом случае выводом будет acc (сокращение от «аккумулятор») - с каждой итерацией я добавляю наше свойство к acc, беря существующее содержимое (...acc) и комбинируя его с нашим новым свойством ([item]: obj[item]). Синтаксис ...acc использует синтаксис расширения для литералов объектов . Второй параметр (просто {} в приведенном ниже примере) является начальным значением 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);

РЕДАКТИРОВАТЬ: За эту ссылку (упоминается wlh в комментарии выше), если дело касается порядка собственности, Object.getOwnPropertyNames() является лучшим выбором, чем Object.keys().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...