Javascript 根据键和值对对象数组进行排序
考虑这一点:Javascript 根据键和值对对象数组进行排序,javascript,arrays,sorting,object,Javascript,Arrays,Sorting,Object,考虑这一点: [{name:'John'},{age:25},{address:'some street'}] 正如您所看到的,没有一个键是一致的名称,因此我无法使用 arr.sort((a,b)=> a.consistentKey < b.consistentKey); 如果您想先按键排序,然后再按值排序,可以尝试以下方法: vara=[{姓名:'John'},{年龄:25},{地址:'somestreet'}]; 警报(JSON.stringify(a.sort)(a,b)
[{name:'John'},{age:25},{address:'some street'}]
正如您所看到的,没有一个键是一致的名称,因此我无法使用
arr.sort((a,b)=> a.consistentKey < b.consistentKey);
如果您想先按键排序,然后再按值排序,可以尝试以下方法:
vara=[{姓名:'John'},{年龄:25},{地址:'somestreet'}];
警报(JSON.stringify(a.sort)(a,b)=>{
nameA=Object.keys(a)[0];
nameB=Object.keys(b)[0];
if(nameA名称B){
返回1;
}
//名字必须相等
返回0;
})));代码>如果使用Object.keys
提取键名,则可以获得执行比较所需的值:
[{name: 'John'}, {age: 25}, {address:'some street'}].sort((a, b) => {
const keyA = Object.keys(a)[0]
const valA = a[keyA]
const keyB = Object.keys(b)[0]
const valB = a[keyB]
if (keyA > keyB) {
return 1
} else if (keyA < keyB) {
return -1
} else /* equal */ {
if (valA > valB) {
return 1
} else if (valA < valB) {
return -1
} else /* equal */ {
return 0
}
}
})
[{name:'John'},{age:25},{address:'some street'}].sort((a,b)=>{
const keyA=对象。键(a)[0]
常数valA=a[keyA]
const keyB=对象。键(b)[0]
常数valB=a[keyB]
如果(键A>键B){
返回1
}否则如果(keyAvalB){
返回1
}否则如果(valA
您可以使用
input.sort((a, b) => {
const keya = Object.keys(a)[0];
const keyb = Object.keys(b)[0];
return keya.localeCompare(keyb) || a[keya].localeCompare(b[keyb]);
});
在面对不同的语言环境时,使用既短又健壮。下面是我将使用的解决方案。此解决方案提供仅键排序、仅值排序、先键后值排序和先值后键排序
class FunkySort{
排序(sortType){
开关(sortType){
“仅限按键”情况:
返回数据=>this.\u sortByKey(数据);
案例“仅值”:
返回数据=>this.\u排序值(数据);
“玛丽”案:
返回数据=>{
数据=此项。_sortByKey(数据);
返回此值。\u排序值(数据);
};
案例“KeyPrimary”:
返回数据=>{
数据=此值。\u排序值(数据);
返回此项。_sortByKey(数据);
};
}
}
_sortByKey(数据){
返回数据。排序((a,b)=>{
var-keyA=Object.keys(a)[0];
var-keyB=Object.keys(b)[0];
返回keyAkeyB-1:0;
});
}
_sortByValue(数据){
返回数据。排序((a,b)=>{
//请注意,在Node>=v7中可以使用'Object.values()`,但不能在valueB?1:0中使用;
});
}
}
const dataArr=[{姓名:'John'},{年龄:25},{地址:'some street'}];
const fs=新FunkySort();
fs.sort('keysPrimary')(dataArr);
请注意,fs.sort
是一个常用函数。第一个调用设置要执行的排序类型,因此fs.sort('keysPrimary')
返回一个函数,该函数获取一个对象数组,首先按值对其排序,然后按键对其排序,从而生成一个按键排序的对象数组,如果有多个对象具有相同的键,则按值对其排序
如果您不需要排序类型的这种灵活性,那么仅使用\u sortByKey
helper方法就足够了。可以解释您希望如何对其进行排序?鉴于对象没有一致的属性名称或类型,它们是不可比较的,我想知道你到底想把它们分类。“善良的用户认为整个物体,会有什么区别?”我正在将随机键-值对添加到数组中,但希望根据键或值对它们进行排序。。。这怎么可能?整个任务对我来说毫无意义。“你想造什么?”托马斯无意冒犯,但如果你不能帮我做这件事。我怀疑你能帮我完成整个项目。你介意控制台吗?记录答案?警报只显示[object object],即使控制台也会打印除chrome以外的对象。我已经为调试整理了内容。底线是这段代码应该可以工作。console.dir(someObject)将允许您在控制台中解包对象内容
input.sort((a, b) => {
const keya = Object.keys(a)[0];
const keyb = Object.keys(b)[0];
return keya.localeCompare(keyb) || a[keya].localeCompare(b[keyb]);
});
class FunkySort {
sort (sortType) {
switch (sortType) {
case 'keysOnly':
return data => this._sortByKey(data);
case 'valuesOnly':
return data => this._sortByValue(data);
case 'valuesPrimary':
return data => {
data = this._sortByKey(data);
return this._sortByValue(data);
};
case 'keysPrimary':
return data => {
data = this._sortByValue(data);
return this._sortByKey(data);
};
}
}
_sortByKey (data) {
return data.sort((a, b) => {
var keyA = Object.keys(a)[0];
var keyB = Object.keys(b)[0];
return keyA < keyB ? -1 : keyA > keyB ? 1 : 0;
});
}
_sortByValue (data) {
return data.sort((a, b) => {
// note that in Node >=v7 you could use `Object.values()`, but not in <v7.0
var valueA = a[Object.keys(a)[0]];
var valueB = b[Object.keys(b)[0]];
return valueA < valueB ? -1 : valueA > valueB ? 1 : 0;
});
}
}
const dataArr = [{name:'John'},{age:25},{address:'some street'}];
const fs = new FunkySort();
fs.sort('keysPrimary')(dataArr);