如何用for循环中的排序键创建Javascript对象?

时间:2019-05-28 10:28:05

标签: javascript

我有一个像这样的数组:

[
  {
    "name": "Name VIC",
    "state": "Victoria"
  },
  {
    "name": "Name NSW",
    "state": "New South Wales"
  }
]

我需要使用state作为键并已排序从数组中创建一个对象。

{
  "New South Wales": [
    {
      "name": "Name NSW",
      "state": "New South Wales"
    }
  ],
  "Victoria": [
    {
      "name": "Name VIC",
      "state": "Victoria"
    }
  ],
}

请注意,NSW状态必须在对象中位于第一位,但它不是数组中的第一项。因此,使用遍历数组创建对象后,结果是Victoria状态首先出现。我知道我可以用更多代码对结果对象进行排序。但是,有什么方法可以创建对象,而键却可以立即排序? (请在下面检查我的代码)

function () {
  let result = {}
  array.forEach((item) => {
    if (!result[item.state]) {
      result[item.state] = []
    }
    result[item.state].push(item)
  })
  return result
}

更新 请再次阅读我的问题。我知道有很多方法可以对键进行排序,但这不是我的意思。我希望键在循环中正确排序,而不是在对象创建之后。

2 个答案:

答案 0 :(得分:0)

您可以使用Object.fromEntries创建这样的对象。但是这里要注意的一件事是对象没有排序键。

var data = [
  {
    "name": "Name VIC",
    "state": "Victoria"
  },
  {
    "name": "Name NSW",
    "state": "New South Wales"
  }
];

var newData = Object.fromEntries(data.map(el => [el.state, el]));

console.log(newData);

答案 1 :(得分:0)

const array = [
  {
    "name": "Name VIC",
    "state": "Victoria"
  },
  {
    "name": "Name NSW",
    "state": "New South Wales"
  }
];

const states = array => array.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0).reduce((result, state) =>  { result[state.state] = state; return result; }, {});

console.log(states(array))