Решение для 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>
Переместите их в массив, отсортируйте этот массив и затем используйте этот массив для своих целей. Вот решение:
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]
})
следующие функциональные виды возражает значением или свойством значения. Если Вы не используете 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 });
Очень короткий и простой!
var sortedList = {};
Object.keys(list).sort((a,b) => list[a]-list[b]).forEach((key) => {
sortedList[key] = list[key]; });
Объекты JavaScript неупорядочены по определению (см. Язык ECMAScript Спецификация , раздел 8.6). Спецификация языка даже не гарантирует, что если вы дважды последовательно перебираете свойства объекта, они будут выводиться в том же порядке во второй раз.
Если вам нужно что-то упорядочить, используйте массив и метод Array.prototype.sort.
вход является объектом, вывод является объектом, с помощью 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));