Сортировать объект JavaScript по длине свойств массива - PullRequest
0 голосов
/ 02 марта 2019

У меня есть такой объект:

var list = {
  "you": [100,200,300], 
  "me": [75,4,5,6,8,9], 
  "foo": [116,345,1,23,56,78], 
  "bar": [15,34]
};

Есть ли способ sort этого объекта по длине свойств массива?

Ожидаемый результат:

var res =  [[116,345,1,23,56,78],[75,4,5,6,8,9],[100,200,300],[15,34]]

Я пытался использовать функцию lodash sortby.

var data = {
  "abc": ["20288", "d8f0", "4a5d", "1a8a0"],
  "kkl": ["bnb", "lll", "zxc"],
  "F17": ["ee547", "42e9"],
  "cnv": ["20288", "d8f0", "4a5d", "1a8a0", "jh67"]
}

var res = _.sortBy(data, function(val) {
  return parseInt(val.length);
});

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

Ответы [ 2 ]

0 голосов
/ 02 марта 2019
  1. Если вы хотите, чтобы вывод представлял собой массив значений отсортированного массива:

    Используйте деструктурирующее присвоение для получения свойства lengthиз полученного массива, вызвав Object.values и затем отсортировав его в порядке убывания.

const data = {
  "abc": ["20288", "d8f0", "4a5d", "1a8a0"],
  "kkl": ["bnb", "lll", "zxc"],
  "F17": ["ee547", "42e9"],
  "cnv": ["20288", "d8f0", "4a5d", "1a8a0", "jh67"]
};
const res = Object.values(data).sort(({length:a}, {length:b}) => b - a);
console.log(res);

Если вы хотите отсортировать сам объект, переставив ключи по длине значений массива.

Есть ли способ отсортировать этот объект по длинесвойства массива?

Если вы хотите переупорядочить исходные свойства объекта в соответствии с length значений массива, то сначала нужно отсортировать по ключам, а затем создать новый объект с отсортированным порядком ключей, использующих Array.reduce.

const data = {
  "abc": ["20288", "d8f0", "4a5d", "1a8a0"],
  "kkl": ["bnb", "lll", "zxc"],
  "F17": ["ee547", "42e9"],
  "cnv": ["20288", "d8f0", "4a5d", "1a8a0", "jh67"]
};
//sorting in descending order
const obj = Object.keys(data)
                  .sort((a, b) => data[b].length - data[a].length )
                  .reduce((acc, ele) => { acc[ele] = data[ele]; return acc; }, {});

console.log(obj);
0 голосов
/ 02 марта 2019

Вы можете использовать Object.values(), чтобы получить значения в массиве, а затем sort на основе результирующего 2D-массивана length вот так:

var data = {
  "abc": ["20288", "d8f0", "4a5d", "1a8a0"],
  "kkl": ["bnb", "lll", "zxc"],
  "F17": ["ee547", "42e9"],
  "cnv": ["20288", "d8f0", "4a5d", "1a8a0", "jh67"]
}

const res = Object.values(data).sort((a, b) => b.length - a.length)
console.log(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...