Сортировать объект массивов по включенному массиву с помощью lodash и найти индексный массив - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть объект массивов,

a.b = [1,4,3]
a.c = ["a","b","c"]

Мне нужно отсортировать в обратном порядке "b", так что новый объект будет

d.b = [4,3,1]
d.c = ["b","c","a"]

Мне также понадобится индексный массив, полученный в результате сортировки:

i = [1,2,0]

Пожалуйста, посоветуйте использовать lodash, спасибо. О * +1010 *

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Вот скромный, но успешный примерный перевод элегантного решения Ори Дрори на coffeescript :

a = {}
a.b = [1, 4, 3]
a.c = [ "a", "b", "c"]

mapByIndex = (arr, indexes) -> _.map(arr, (_, idx) -> arr[indexes[idx]])
i = _.map(a.b, fct = (n, i) -> [n, i])
i = _.sortBy(i,"0")
i = _.map(i, "1")
i = i.reverse()
i = _.mapValues(a, fct = (v) -> if _.isArray(v) then mapByIndex(v, i) else v)

debug _.keys(i)    # b,c
debug _.values(i)    # 4,3,1,b,c,a
debug i.b    # 4,3,1
debug i.c    # b,c,a
0 голосов
/ 17 апреля 2019

Вы можете преобразование Шварца , чтобы добавить текущие индексы и числовые значения из b в массив кортежей [value, index], используя _.map(), сортируя по _.orderBy() кортежей согласнок значению (индекс 0), а затем снова извлеките исходные индексы с помощью _.map() (1 индекс).Теперь вы можете отобразить b и c (другие свойства) в соответствии с массивом индексов и вернуть новый отсортированный объект.

// order an array by an array of indexes
const mapByIndex = (arr, indexes) => _.map(arr, (_, idx) => arr[indexes[idx]])

const fn = (sortKey, o) => {
  const i = _(o[sortKey])
    .map((n, i) => [n, i]) // store the current index in tuples
    .orderBy('0') // sort the tuples by the number from b
    .map('1') // extract the original index
    .value()

  return _.assign({ i }, _.mapValues(o, v => 
    _.isArray(v) ? mapByIndex(v, i) : v
  ))
}

const obj = {
  b: [1,4,3],
  c: ["a","b","c"]
}

const result = fn('b', obj)

const i = result.i

const d = _.omit(result, 'i')

console.log(d)

console.log(i)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
...