Заказ По индивидуальному заказу в объекте внутри свойства - PullRequest
0 голосов
/ 13 декабря 2018

Мне нужно отсортировать массив объектов по свойству подобъекта:

foo = [
  {
    bar: {
      order: "hello" 
    } 
  },
  {
    bar: {
      order: "something" 
    } 
  },
  {
    bar: {
      order: "else" 
    } 
  },
]

Если я хочу, чтобы порядок объектов foo основывался на произвольном порядке (не в алфавитном порядке!) устанавливается order значениями вроде

{ "something": 1, "hello": 2, "else": 3 }

с чем-то вроде _orderBy(foo, indexOfMyCustomOrder, 'desc'), как мне этого добиться?Или мне нужно разделить эту логику на две функции?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Вы можете сделать это так:

const foo = [{ bar: { order: "hello" } }, { bar: { order: "something" } }, { bar: { order: "else" } } ]
let order = { something: 0, hello: 1, ["else"]: 2 }

console.log(_.orderBy(foo, x => order[x.bar.order]))
console.log(_.orderBy(foo, x => order[x.bar.order], 'desc'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Где вы определили свой заказ с помощью карты index и используете его для фильтрации данных.

0 голосов
/ 13 декабря 2018

Вы можете сделать это без lodash, используя функцию, где вы получаете ключи вашего пользовательского заказа, вы сортируете их по их значению и режиму (desc или asc), а затем уменьшаете их, фильтруя массив, который вы хотите упорядочить, добавляякаждый раз элементы.Надеюсь, это поможет.

const foo = [{
    bar: {
      order: "hello" 
    } 
  },{
    bar: {
      order: "something" 
    } 
  },{
    bar: {
      order: "else" 
    } 
  },{
    bar: {
      order: "else" 
    } 
  },{
    bar: {
      order: "anotherelse" 
    } 
  }];

const order = { "something": 1, "hello": 3, "else": 2, "missing": 4, "anotherelse": 2 };

const orderWith = (array, order, desc) => 
    Object.keys(order)
          .sort((a, b) => desc ? order[b] - order[a] : order[a] - order[b])
          .reduce((acc, val) => 
              acc.concat(array.filter(({ bar: { order }}) => val === order))
          , []);

console.log('Descending order');
console.log(orderWith(foo, order));

console.log('Ascending order')
console.log(orderWith(foo, order, true));
0 голосов
/ 13 декабря 2018

Определите indexOfMyCustomOrder следующим образом:

const indexOfMyCustomOrder = o => order[o.bar.order];

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

См. Фрагмент:

const foo = [{bar:{order:"hello"}},{bar:{order: "something"}},{bar:{order:"else"}}];
const order = { "something": 1, "hello": 2, "else": 3 };

const result = _.orderBy(foo, o => order[o.bar.order]);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>
...