2016-01-11 87 views
1

我在下面显示的JavaScript中有一个字典样式的数组对象,并希望通过属性对它进行排序。这将如何完成?我知道类似的问题已经得到解答,但我认为我的结构不同。仅仅运行array.sort(compare)不适合我,因为我没有索引整数。谢谢!JavaScript按属性值排序词典

var myData = { 
    "userOne": { 
     "firstName": "Felix", 

    }, 
    "userTwo": { 
     "firstName": "Bob", 

    }, 
    "userThree": { 
     "firstName": "Anna", 

    } 
} 

我想上述阵列myDatafirstName进行排序,使得具有Anna对象出现第一,其次Bob,随后Felix。非常感谢!!

+0

没有这样的东西“*字典式的数组对象*” – Amit

+2

你不能 - 对象没有秩序。 – josh3736

+0

你确定'myData'不应该是一个数组吗? –

回答

5

您可以使用ES6地图这是迭代:

var myData = new Map(); 
myData.set('userOne', {'firstName': 'Felix'}); 
myData.set('userTwo', {'firstName': 'Bob'}); 
myData.set('userThree', {'firstName': 'Anna'}); 

function sortByProp(data, prop) { 
    return new Map([...data.entries()].sort((a, b) => a[1][prop] > b[1][prop])); 
}; 

console.log(sortByProp(myData, "firstName")); 
+0

你能解释一下你在做什么吗? – 1252748

+1

当然, 1 。创建一个类似于Object的ES6映射,但也被排序(和更多):https://developer.mozilla.org/en/docs/Web/J avaScript/Reference/Global_Objects/Map 2.将元素插入到地图中。 3.使用sortByProp函数,该函数将地图分解为数组,按属性名称对其进行排序并构建新的排序地图。 我相信记录[... data.entries()]部分可能会帮助你更好地理解它。 –

2

不幸的是,你的数据格式是不可能的。我们在这里处理JS对象。根据定义:

对象是Object类型的成员。 它是一个无序的属性集合,每个属性都包含原始值,对象或函数。存储在对象属性中的函数称为方法。

如果您将它作为对象数组,那可能会有所帮助。

2

下面是一些代码,将排序基于密钥解决你的根本问题,通过创建一个数组,而不是一个对象,填充内的对象:

arrayOfSortedObjects = Object.keys(myData).sort(function(a,b) { 
    return myData[a].firstName.localeCompare(myData[b].firstName); 
}).map(function(k) { 
    return myData[k]; 
});