我有一个这样的对象:
{
"name":['John','Bob','Ram','Shyam'],
"marks":['64','22','80','32']
}
我必须对名称进行排序。对名称进行排序后,必须根据名称匹配标记。
当我使用sort()函数时,它仅对名称进行排序。如何对整体对象进行排序?
答案 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
创建另一个键,其值将是一个对象数组,其中每个对象都具有名称分别为name
和mark
的键。
在创建此数组时,您可以使用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)