Переупорядочить массив объектов на основе массива строк? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть следующие структуры данных:

const fieldOrder = [
  'title',
  'first_name',
  'last_name',
  'address_1',
  'address_2',
  'city',
  'state',
  'zipcode',
  'country',
]

const fields = [
  {
    name: 'first_name',
    value: 'John'
  },
  {
    name: 'title',
    value: 'Mr'
  }
  ...etc
]

И я хотел бы переупорядочить массив объектов fields на основе положения клавиши name в массиве fieldOrder. Как это возможно? Возможно, с помощью метода Array.sort как-то?

И, вообще говоря, это лучший способ представить порядок?

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

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

const fieldOrder = [
  'title',
  'first_name',
  'last_name',
  'address_1',
  'address_2',
  'city',
  'state',
  'zipcode',
  'country',
].reduce((r, e, i) => {
  r[e] = i;
  return r
}, {})

const fields = [{
    name: 'first_name',
    value: 'John'
  },
  {
    name: 'title',
    value: 'Mr'
  }
].sort((a, b) => fieldOrder[a.name] - fieldOrder[b.name])

console.log(fields)
1 голос
/ 19 февраля 2020

Найдите индекс name в fieldOrder и используйте .sort для достижения этого:

const fieldOrder = [
  "title",
  "first_name",
  "last_name",
  "address_1",
  "address_2",
  "city",
  "state",
  "zipcode",
  "country"
];

const fields = [
  {
    name: "first_name",
    value: "John"
  },
  {
    name: "title",
    value: "Mr"
  }
];

const result = fields.sort((a,b) => {
  const aNdx = fieldOrder.findIndex(e => e === a.name);
  const bNdx = fieldOrder.findIndex(e => e === b.name);

  return aNdx - bNdx;
})

console.log(result);
0 голосов
/ 19 февраля 2020

Вы можете отсортировать его по индексу в массиве;

const fieldOrder = [
    'title',
    'first_name',
    'last_name',
    'address_1',
    'address_2',
    'city',
    'state',
    'zipcode',
    'country',
  ]
  
  const fields = [
    {
        name: 'first_name',
        value: 'John'
    },
    {
        name: 'title',
        value: 'Mr'
    },
    {
        name: 'city',
        value: 'JNB'
    },
    {
        name: 'country',
        value: 'RSA'
    }
]

fields.sort( (a, b) => fieldOrder.indexOf(a.name) - fieldOrder.indexOf(b.name));

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