Javascript有使用数字索引["john", "Bob", "Joe"]
的数组和对象,这些对象可以像关联数组或“Map”一样使用,允许对象值{"john" : 28, "bob": 34, "joe" : 4}
的字符串键。
在PHP中,A)按值排序(同时保留键)和B)测试关联数组中是否存在值都很容易。
$array = ["john" => 28, "bob" => 34, "joe" => 4];
asort($array); // ["joe" => 4, "john" => 28, "bob" => 34];
if(isset($array["will"])) { }
你将如何在Javascript中实现这个功能?
这是加权列表或排序集的常见需求,在这些列表或集合中,您需要在数据结构中保留值的单个副本(如标记名),同时保留加权值。
这是目前为止我想到的最好的了
function getSortedKeys(obj) {
var keys = Object.keys(obj);
keys = keys.sort(function(a,b){return obj[a]-obj[b]});
var map = {};
for (var i = keys.length - 1; i >= 0; i--) {
map[keys[i]] = obj[keys[i]];
};
return map;
}
var list = {"john" : 28, "bob": 34, "joe" : 4};
list = getSortedKeys(list);
if(list["will"]) { }
8条答案
按热度按时间xpszyzbs1#
看看this answer by Luke Schafer,我想我可能已经找到了一种更好的方法来处理这个问题,那就是扩展Object.prototype:
http://jsfiddle.net/Xeoncross/kq3gbwgh/
sxpgvts32#
在ES6中,你可以选择用
sort
方法扩展Map
构造函数/类,该方法带有可选的比较函数(就像数组一样),sort
方法将带有两个参数,每个参数都是键/值对,这样排序就可以在键或值(或两者)上进行。sort
方法将依赖于Map的记录行为,即按照插入顺序迭代条目,因此这个新方法将根据排序顺序访问条目,然后删除并立即重新插入它们。下面是可能的情况:
9bfwbjaz3#
我不知道为什么这些答案中没有一个提到内置JS类Set的存在,似乎是ES6的一个补充,也许这就是原因。
理想情况下覆盖
add
或keys
如下...注意覆盖keys
甚至不需要访问Set
对象的原型。当然,您可以覆盖整个Set
类的这些方法。或者创建一个子类SortedSet
。用法:
打印输出:
一、二、三
注意
Set.keys()
返回的不是Set
中的元素,而是一个迭代器,你可以选择返回排序后的数组,但是很明显你会破坏类的"契约"。要覆盖哪一个?取决于您的使用和
Set
的大小。如果您覆盖了这两个,您将重复排序活动,但在大多数情况下,这可能并不重要。NB我建议的
add
函数当然很幼稚,只是一个"初稿":每次add
时重建整个集合可能会非常昂贵。显然有更聪明的方法来完成这一点,方法是基于检查Set
中的现有元素并使用比较函数,二叉树结构 *,或一些其它方法来确定在其中的位置以添加要添加的候选(我之所以说"候选",是因为如果已经发现存在一个"相同的"元素,即它本身,那么它将被拒绝)。这个问题还询问了排序Map的类似安排...事实上,ES6有一个新的Map类,可以进行类似的处理...而且
Set
只是一个专用的Map
,正如您所料。vybvopom4#
通常不对对象进行排序,但如果进行排序:Sorting JavaScript Object by property value
如果你想对一个数组进行排序,我们可以这样说
您可以随时使用
Array.prototype.sort
函数。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sortsxissh065#
也许这段代码看起来像你想要的:
khbbv19g6#
如果您使用开源项目jinqJs,这很容易。
参见Fiddler
3phpmpom7#
下面是一个OrderedMap的实现,使用函数
get()
和set()
来提取键值对或者将键值对推送到OrderedMap
,它在内部使用一个数组来维护顺序。g52tjvyc8#
https://github.com/js-sdsl/js-sdsl
Js-sdl中的
OrderedMap
可能会有帮助。这是一个参照C++ STL Map实现的分类Map。