Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript按属性值对字典进行排序_Javascript_Arrays_Node.js_Sorting_Dictionary - Fatal编程技术网

JavaScript按属性值对字典进行排序

JavaScript按属性值对字典进行排序,javascript,arrays,node.js,sorting,dictionary,Javascript,Arrays,Node.js,Sorting,Dictionary,我在JavaScript中有一个字典样式的数组对象,如下所示,并希望按属性对其排序。如何做到这一点?我知道类似的问题已经得到了回答,但我认为我的结构不同。简单地运行array.sort(compare)对我不起作用,因为我的索引没有整数。谢谢 var myData = { "userOne": { "firstName": "Felix", }, "userTwo": { "firstName": "Bob", }, "

我在JavaScript中有一个字典样式的数组对象,如下所示,并希望按属性对其排序。如何做到这一点?我知道类似的问题已经得到了回答,但我认为我的结构不同。简单地运行
array.sort(compare)
对我不起作用,因为我的索引没有整数。谢谢

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

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

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

    }
}

我希望上面的数组
myData
firstName
排序,这样带有
Anna
的对象首先出现,然后是
Bob
,然后是
Felix
。非常感谢你

不幸的是,您的数据格式无法实现这一点。我们在这里处理的是JS对象。根据定义:

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


如果您将其设置为对象数组,这可能会有所帮助。

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

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


如果将其设置为对象数组,则可能会有所帮助。

您可以使用可编辑的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"));

您可以使用可编辑的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"));

下面是一些代码,通过创建一个数组而不是一个对象来解决您的基本问题,该数组由基于键排序的内部对象填充:

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

下面是一些代码,通过创建一个数组而不是一个对象来解决您的基本问题,该数组由基于键排序的内部对象填充:

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

没有“字典式数组对象”这类东西是不能的——对象没有顺序,不可能对对象进行排序。看看吧。你确定
myData
不应该是数组吗?好吧,我想最好的办法是转换我的数据格式。谢谢没有“字典式数组对象”这类东西是不能的——对象没有顺序,不可能对对象进行排序。看看吧。你确定
myData
不应该是数组吗?好吧,我想最好的办法是转换我的数据格式。谢谢你能解释一下你在这里做什么吗。创建一个ES6映射,该映射类似于Object,但也是有序的(以及更多的):2。将元素插入到地图中。3.使用sortByProp函数将映射分解为一个数组,按属性名称对其排序,并构建一个新的排序映射。我相信记录[…data.entries()]部分可以帮助您更好地理解它。您能解释一下您在这里做什么吗?当然,1。创建一个ES6映射,该映射类似于Object,但也是有序的(以及更多的):2。将元素插入到地图中。3.使用sortByProp函数将映射分解为一个数组,按属性名称对其排序,并构建一个新的排序映射。我相信记录[…data.entries()]部分可能会帮助您更好地理解它。