如何根据键降序对对象的对象排序?

时间:2019-04-11 22:33:46

标签: javascript json reactjs

我正在尝试根据对象的键排序对象的数组。 如何对已按升序排列的JSON对象进行排序?请参见下面。

我试图将数据值对象转换为它自己的数组,然后以这种方式对其进行排序,但是我遇到语法错误。

var object = [
A1: {
errors: {}
otherData: {}
data: {
  "1": {
    "name": "Ashley",
  },
  "2": {
    "name": "Cardiff",
  },
  "3": {
    "name": "Reading",
    }
}},

A2: {
errors: {}
otherData: {}
data: {
  "4": {
    "name": "Susan",
  },
  "5": {
    "name": "Bee",
  },
  "6": {
    "name": "Bob",
    }
}}];

我希望它是

var object = [
A1: {
errors: {}
otherData: {}
data: {
  "3": {
    "name": "Reading",
  },
  "2": {
    "name": "Cardiff",
  },
  "1": {
    "name": "Ashley",
    }
}},

A2: {
errors: {}
otherData: {}
data: {
  "6": {
    "name": "Bob",
  },
  "5": {
    "name": "Bee",
  },
  "4": {
    "name": "Susan",
    }
}}];

2 个答案:

答案 0 :(得分:0)

const sortByField = (field, isRevered = false, primerFn) => {
  if (field) {
    var key = primerFn ? (x) => primerFn(x[field]) : (x) => x[field];

    isRevered = !isRevered ? 1 : -1;

    return (a, b) => {
      /*eslint-disable */
      return a = key(a), b = key(b), isRevered * ((a > b) - (b > a));
      /*eslint-enable */
    }
  }
  else {
    return (a, b) => {
      return isRevered ? a < b : a > b;
    }
  }
}

var dataToSort = {
  A1: {
    errors: {},
    otherData: {},
    data: {
      "1": { "name": "Ashley", },
      "2": { "name": "Cardiff", },
      "3": { "name": "Reading", }
    }
  },
  A2: {
    errors: {},
    otherData: {},
    data: {
      "4": { "name": "Susan", },
      "5": { "name": "Bee", },
      "6": { "name": "Bob", }
    }
  }
};

const sortObjectByKeys = (obj) => {
  let values = [];
  let keys = [];
  Object.keys(obj).forEach(key => {
    keys.push(key);
    values.push(obj[key])
  })

  values.sort(sortByField("name", true, (value) => value.toLowerCase()));

  let sortedObject = {};

  values.forEach((value, index) => {
    sortedObject[keys[index]] = value;
  })

  return sortedObject;
}

let sortedData = {};
Object.keys(dataToSort).forEach(dataKey => {
  sortedData[dataKey] = {
    ...dataToSort[dataKey],
    data: sortObjectByKeys(dataToSort[dataKey].data)
  }
})

console.log(JSON.stringify(sortedData));

答案 1 :(得分:0)

如果我的理解正确,您想按首字母的字母顺序排序。这很不错,但它应该可以满足您的需求

const arr1 = object.map(function(o) {
     return Object.values(o[Object.keys(o)].data).sort((a, b) => a - b);
})

我将尝试解释这里发生的事情。 map遍历数组中的每个对象并返回一个全新的数组。 o[Object.keys(o)].data正在选择A1A2数据键。然后,我们要说的是我们希望这些数据对象中的对象具有围起来的Object.keys()值,从而为我们提供名称。从那里,我们只是调用sort并为其提供回调。