Я не видел такого конкретного подхода, поэтому я хотел бы использовать метод сравнения, который мне нравится использовать как для string
, так и для number
:
const objs = [
{ first_nom: 'Lazslo', last_nom: 'Jamf' },
{ first_nom: 'Pig', last_nom: 'Bodine' },
{ first_nom: 'Pirate', last_nom: 'Prentice' }
];
const sortBy = fn => (a, b) => -(fn(a) < fn(b)) || +(fn(a) > fn(b))
const getLastName = o => o.last_nom
const sortByLastName = sortBy(getLastName)
objs.sort(sortByLastName)
console.log(objs.map(getLastName))
Вот объяснение sortBy()
:
sortBy()
принимает параметр fn
, который выбирает какое значение для объекта для использования в качестве сравнения и возвращает функцию, которая может передаются непосредственно на Array.prototype.sort()
. В этом примере мы используем o.last_nom
как значение для сравнения, поэтому всякий раз, когда мы получаем два объекта через Array.prototype.sort()
, такие как
{ first_nom: 'Lazslo', last_nom: 'Jamf' }
и
{ first_nom: 'Pig', last_nom: 'Bodine' }
мы используем
(a, b) => -(fn(a) < fn(b)) || +(fn(a) > fn(b))
для их сравнения.
Вспоминая, что fn = o => o.last_nom
, мы можем развернуть функцию сравнения с эквивалентом
(a, b) => -(a.last_nom < b.last_nom) || +(a.last_nom > b.last_nom)
. Логическое Оператор OR ||
имеет функцию короткого замыкания, которая здесь очень полезна. Из-за того, как это работает, тело функции выше означает
if (a.last_nom < b.last_nom) return -1
return +(a.last_nom > b.last_nom)
Итак, если a < b
мы возвращаем -1
, в противном случае, если a > b
, то мы возвращаем +1
, но если a == b
, тогда a < b
и a > b
являются ложными, поэтому он возвращает +0
.
В качестве дополнительного бонуса здесь эквивалент в ECMAScript 5.1 без функций стрелок, что, к сожалению, не совсем так:
var objs = [
{ first_nom: 'Lazslo', last_nom: 'Jamf' },
{ first_nom: 'Pig', last_nom: 'Bodine' },
{ first_nom: 'Pirate', last_nom: 'Prentice' }
];
var sortBy = function (fn) {
return function (a, b) {
return -(fn(a) < fn(b)) || +(fn(a) > fn(b))
}
}
var getLastName = function (o) { return o.last_nom }
var sortByLastName = sortBy(getLastName)
objs.sort(sortByLastName)
console.log(objs.map(getLastName))
Похоже, вы запускаете это в режиме dev через webpack? Если это правильно, и ваш рабочий процесс заключается в том, что вы собираетесь создавать приложение Vue и совместно использовать его с вашим Laravel-файлом, вам просто нужно обновить config/index.js
, чтобы иметь запись proxyTable
, которая пересылает запросы веб-пакета к правильному dev Laravel.
Это будет выглядеть примерно так.
module.exports = {
dev: {
proxyTable: {
"/": "http://127.0.0.1:8000/api/v1/login"
}
}
}
Существует дополнительная информация о том, как это работает; https://vuejs-templates.github.io/webpack/proxy.html
Cross Origin Resource Sharing - это механизм, который использует дополнительные заголовки HTTP, чтобы сообщить браузеру, что веб-приложение, работающее на одном источнике (клиенте), имеет разрешение на доступ к выбранным ресурсам с сервера в другом источнике.
В основном, вашему Vue-приложению ( http: // localhost: 8080 ) должен быть разрешен доступ к вашей конечной точке Laravel ( http://127.0.0.1:8000/api/v1/ login ) Это должно помешать мне ударить конечную точку Laravel с моего вредоносного веб-сайта и действовать как аутентифицированный пользователь.
На основании docs вам нужно добавить 'allowedOrigins' => ['*'],
, но это означает, что вы открываете свой сервер для всех запросов. Это нормально, если это общедоступный API, но в этом контексте это звучит не так, как вы этого хотите. Вместо этого в этом случае это будет 'allowedOrigins' => ['localhost:8080'],
, чтобы ваше приложение Vue могло потреблять ваш сервер Laravel.
Вы должны использовать либо localhost
, либо 127.0.0.1
для всех запросов. Как правило, в коде вы должны делать вызовы на сервер, просто добавляя URI к текущему хосту, не добавляя хост и порт в строку URI. Если вы загружаете свою страницу с определенного хоста, например 127.0.0.1
, а затем пытаетесь выполнить запрос AJAX другому хосту, например www.host.com
, запрос блокируется для предотвращения атак XSS