javascript - JavaScript:根据“外部”参数对数组进行排序
问题描述
在 JavaScript 中,我有一个对象数组和一个输入值,如下所示:
const inputVal = 'foo';
const objArray = [
{title: 'blahaa', type: 'foobar'},
{title: 'foobar', type: 'wohoo'},
{title: 'foobar', type: 'foobar'},
{title: 'foobar', type: 'aaaabaa'},
{title: 'foobar', type: 'moo'},
{title: 'aaah', type: 'foogoo'},
{title: 'foohiii', type: 'foobar'},
{title: 'aaah', type: 'foobar'},
{title: 'foodoo', type: 'aaaabaa'},
{title: 'gaaaaaah', type: 'foobar'},
{title: 'foobar', type: 'foogoo'},
];
如您所见,数组中的所有元素在标题或类型中都有以“foo”开头的属性。此外,所有元素都是唯一的,相同的标题和/或类型可以在多个元素中,但两者的相同组合不能出现两次。
我想按以下方式对该数组进行排序:
- 标题和类型都以
inputVal
- 按字母顺序输入
- 标题按字母顺序
- 标题以
inputVal
但不是类型 开头- 按字母顺序输入
- 标题按字母顺序
- 类型以
inputVal
但不是标题 开头- 按字母顺序输入
- 标题按字母顺序
示例列表将按以下方式排序:
const objArray = [
{title: 'foobar', type: 'foobar'}, // Criterium 1
{title: 'foohiii', type: 'foobar'}, // Criterium 1
{title: 'foobar', type: 'foogoo'}, // Criterium 1
{title: 'foobar', type: 'aaaabaa'}, // Criterium 2
{title: 'foodoo', type: 'aaaabaa'}, // Criterium 2
{title: 'foobar', type: 'moo'}, // Criterium 2
{title: 'foobar', type: 'wohoo'}, // Criterium 2
{title: 'aaah', type: 'foobar'}, // Criterium 3
{title: 'blahaa', type: 'foobar'}, // Criterium 3
{title: 'gaaaaaah', type: 'foobar'}, // Criterium 3
{title: 'aaah', type: 'foogoo'}, // Criterium 3
];
我尝试使用array.prototype.sort(callback)
几种不同的回调函数,但似乎没有得到正确的回调函数。谁能帮我?
解决方案
您可以连接标准并首先按三组排序,然后按值排序。
const
value = 'foo',
start = (v => s => s.startsWith(v))(value),
array = [{ title: 'blahaa', type: 'foobar' }, { title: 'foobar', type: 'wohoo' }, { title: 'foobar', type: 'foobar' }, { title: 'foobar', type: 'aaaabaa' }, { title: 'foobar', type: 'moo' }, { title: 'aaah', type: 'foogoo' }, { title: 'foohiii', type: 'foobar' }, { title: 'aaah', type: 'foobar' }, { title: 'foodoo', type: 'aaaabaa' }, { title: 'gaaaaaah', type: 'foobar' }, { title: 'foobar', type: 'foogoo' }];
array.sort((a, b) =>
(start(b.title) && start(b.type)) - (start(a.title) && start(a.title))
|| start(b.title) - start(a.title)
|| start(b.type) - start(a.type)
|| a.type.localeCompare(b.type)
|| a.title.localeCompare(b.title)
);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- angular - Jspdf v3 autotable colspan 功能不起作用
- mysql - MySql 分区表 - 与日期 IN (...) 子句相比,使用 PK 在日期范围之间进行选择非常慢
- javascript - 使用过滤器和每个删除数组中的对象
- c++ - 不可复制类型的 std::initializer_list 替代方案
- javascript - 完成承诺后渲染 [ React Native ]
- python - Python Flask XSS 中和(Veracode 警报)
- java - 参数化 Spring Value 注释字符串
- webview - 信使 webview 的 URL 是否需要是 HTTPS?
- react-native - 如何通过嵌套映射函数获取 no_images/images
- ios - RxSwift,MVVM:与子视图控制器的通信