用Javascript排序对象元素

时间:2019-03-05 05:09:58

标签: javascript json sorting

我有一个这样的对象:

 {
  "name":['John','Bob','Ram','Shyam'],
  "marks":['64','22','80','32']
 }

我必须对名称进行排序。对名称进行排序后,必须根据名称匹配标记。

当我使用sort()函数时,它仅对名称进行排序。如何对整体对象进行排序?

2 个答案:

答案 0 :(得分:4)

一种选择是更改数据结构,使其更可排序。例如:

const data = {
 names: ['John','Bob','Ram','Shyam'],
 marks: ['64','22','80','32']
}

const people = data.names.map((name, i) => ({
  name,
  mark: data.marks[i]
}))

const sorted = people.sort((a, b) => a.name.localeCompare(b.name))

console.log(sorted)

第二种选择是保留一个索引数组,您可以根据数据对索引进行排序。这不会改变您的原始结构,但是我认为这不是一个好选择,因为很难同时保持名称和标记数组的同步。例如:

const data = {
 names: ['John','Bob','Ram','Shyam'],
 marks: ['64','22','80','32']
}

const index = Array.from(Array(data.names.length).keys())

index.sort((a, b) => data.names[a].localeCompare(data.names[b]))

console.log(index)

// use the names & marks
index.forEach(i => {
  console.log(`${data.names[i]} - ${data.marks[i]}`)
})

答案 1 :(得分:0)

您可以使用名称rel创建另一个键,其值将是一个对象数组,其中每个对象都具有名称分别为namemark的键。

在创建此数组时,您可以使用sort函数对这些对象进行排序

let obj = {
  "name": ['John', 'Bob', 'Ram', 'Shyam'],
  "marks": ['64', '22', '80', '32']
}

obj.rel = obj.name.map(function(e, i) {
  return {
    name: e,
    mark: obj.marks[i]
  }
}).sort((a, b) => a.name.localeCompare(b.name))

console.log(obj)