Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据键和值对对象数组进行排序_Javascript_Arrays_Sorting_Object - Fatal编程技术网

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);