Сортировка объекта JavaScript по значению свойства

Решение для Laravel Framework

Согласно Laravel 5.4. * документация ; Вы должны установить длину строки по умолчанию внутри метода

boot

blockquote>

в

app / Providers / AppServiceProvider. php

blockquote>

следующим образом:

use Illuminate\Support\Facades\Schema;

public function boot() 
{
    Schema::defaultStringLength(191); 
}

Объяснение этого исправления, данное Laravel 5.4. * documentation ;

Laravel использует набор символов utf8mb4 по умолчанию, который включает поддержку для хранения «emojis» в базе данных. Если вы используете версию MySQL старше версии 5.7.7 или MariaDB старше версии 10.2.2, вам может потребоваться вручную настроить длину строки по умолчанию, сгенерированную миграциями, чтобы MySQL создавал для них индексы. Вы можете настроить это, вызывая метод Schema :: defaultStringLength в вашем AppServiceProvider

. Кроме того, вы можете включить параметр innodb_large_prefix для вашей базы данных. Обратитесь к документации вашей базы данных, чтобы узнать, как правильно включить эту опцию.

blockquote>

576
задан meetar 15 October 2018 в 22:04
поделиться

5 ответов

Переместите их в массив, отсортируйте этот массив и затем используйте этот массив для своих целей. Вот решение:

var maxSpeed = {
    car: 300, 
    bike: 60, 
    motorbike: 200, 
    airplane: 1000,
    helicopter: 400, 
    rocket: 8 * 60 * 60
};
var sortable = [];
for (var vehicle in maxSpeed) {
    sortable.push([vehicle, maxSpeed[vehicle]]);
}

sortable.sort(function(a, b) {
    return a[1] - b[1];
});

//[["bike", 60], ["motorbike", 200], ["car", 300],
//["helicopter", 400], ["airplane", 1000], ["rocket", 28800]]

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

var objSorted = {}
sortable.forEach(function(item){
    objSorted[item[0]]=item[1]
})
641
ответ дан 22 November 2019 в 21:53
поделиться

TypeScript

следующие функциональные виды возражает значением или свойством значения. Если Вы не используете TypeScript, можно удалить информацию о типе для преобразования его в JavaScript.

/**
 * Represents an associative array of a same type.
 */
interface Dictionary<T> {
  [key: string]: T;
}

/**
 * Sorts an object (dictionary) by value or property of value and returns
 * the sorted result as a Map object to preserve the sort order.
 */
function sort<TValue>(
  obj: Dictionary<TValue>,
  valSelector: (val: TValue) => number | string,
) {
  const sortedEntries = Object.entries(obj)
    .sort((a, b) =>
      valSelector(a[1]) > valSelector(b[1]) ? 1 :
      valSelector(a[1]) < valSelector(b[1]) ? -1 : 0);
  return new Map(sortedEntries);
}

Использование

var list = {
  "one": { height: 100, weight: 15 },
  "two": { height: 75, weight: 12 },
  "three": { height: 116, weight: 9 },
  "four": { height: 15, weight: 10 },
};

var sortedMap = sort(list, val => val.height);

порядок ключей в объекте JavaScript не гарантируется, таким образом, я отсортирую и возвращаю результат как Map объект, который сохраняет порядок сортировки.

, Если Вы хотите преобразовать его назад для Возражения, можно сделать это:

var sortedObj = {} as any;
sortedMap.forEach((v,k) => { sortedObj[k] = v });
1
ответ дан orad 4 November 2019 в 07:34
поделиться

Очень короткий и простой!

var sortedList = {};
Object.keys(list).sort((a,b) => list[a]-list[b]).forEach((key) => {
    sortedList[key] = list[key]; });
2
ответ дан 22 November 2019 в 21:53
поделиться

Объекты JavaScript неупорядочены по определению (см. Язык ECMAScript Спецификация , раздел 8.6). Спецификация языка даже не гарантирует, что если вы дважды последовательно перебираете свойства объекта, они будут выводиться в том же порядке во второй раз.

Если вам нужно что-то упорядочить, используйте массив и метод Array.prototype.sort.

36
ответ дан 22 November 2019 в 21:53
поделиться

вход является объектом, вывод является объектом, с помощью lodash & js встроенный lib, с убыванием или возрастающей опцией, и не видоизменяет входной объект

, например, вход & вывод

{
  "a": 1,
  "b": 4,
  "c": 0,
  "d": 2
}
{
  "b": 4,
  "d": 2,
  "a": 1,
  "c": 0
}

реализация

const _ = require('lodash');

const o = { a: 1, b: 4, c: 0, d: 2 };


function sortByValue(object, descending = true) {
  const { max, min } = Math;
  const selector = descending ? max : min;

  const objects = [];
  const cloned = _.clone(object);

  while (!_.isEmpty(cloned)) {
    const selectedValue = selector(...Object.values(cloned));
    const [key, value] = Object.entries(cloned).find(([, value]) => value === selectedValue);

    objects.push({ [key]: value });
    delete cloned[key];
  }

  return _.merge(...objects);
}

const o2 = sortByValue(o);
console.log(JSON.stringify(o2, null, 2));
0
ответ дан 22 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: