javascript 排序 obj 改变 id #'s

标签 javascript

我正在尝试按字母顺序对哈希表下拉菜单进行排序...使用此函数:

function getSortedKeys(obj) {
    var keys = [];
    for(var key in obj) {
        keys.push(obj[key]);
        keys[keys.length-1]['key'] = key;
    }
    return keys.sort(function(a,b){
        return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;
    });           
}

这对下拉菜单进行排序...虽然它更改了我的菜单项的原始 ID#,这在我的网站上搞砸了一些事情...是否可以保留每个菜单项的原始 ID# 并仍然排序?

抱歉..这是哈希码:

var clientProjectsHash = {};
clientProjectsHash['1'] = {};
clientProjectsHash['1']['name'] = 'RONA';
clientProjectsHash['2'] = {};
clientProjectsHash['2']['name'] = 'CMS';
clientProjectsHash['3'] = {};
clientProjectsHash['3']['name'] = 'ALT';

getSortedKeys 由以下人员调用:

function getInitialClient() {
    clientProjectsHash = getSortedKeys(clientProjectsHash);
        for (clientKey in clientProjectsHash) {
            if(clientKey > 0) {
                return clientKey;
            }
        }
    }

最佳答案

问题是您要返回一个数组,并期望它是一个对象。这些在 JavaScript 中是不同的东西。没有什么是“改变”的;您的“ID”(或“哈希”)未被修改。

您的clientProjectsHash 开始时是一个对象!对象是无序的,可以将任何字符串作为键。当您执行 getSortedKeys(clientProjectsHash); 时,您将返回一个数组!数组是有序的,并且具有从 0 开始的数字索引(键)。


clientProjectsHash = getSortedKeys(clientProjectsHash);
for (clientKey in clientProjectsHash) {
}

覆盖 clientProjectsHash数组。然后你 for..in 覆盖它(顺便说一下,你不应该 对数组使用 for..in)。

getSortedKeys 返回的数组如下所示:

[
    {
        name: 'ALT',
        key: 3
    },
    {
        name: 'CMS',
        key: 2
    },
    {
        name: 'RONA',
        key: 1
    }
]

因此,在您的for..in 中,clientKey 将为012。数组的索引。您的 key没有改变,您只是读取了错误的值。

试试这个:

function getInitialClient() {
    var clientKeys = getSortedKeys(clientProjectsHash);
    for(var i = 0, len = clientKeys.length; i < len; i++){
        var clientKey = clientKeys[i];
        if(clientKey.key > 0){
            return clientKey.key;
        }
    }
}

关于javascript 排序 obj 改变 id #'s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17530504/

相关文章:

javascript - 在ie9中上传得到js错误: SCRIPT5007: Object expected

javascript - 更改自己对象中函数内对象的属性

javascript - 如何将范围输入的值与输出标签连接起来?

javascript - 使用 vueJS 有条件地设置 href 属性

javascript - NestJS - 如何在主应用程序模块文件中使用 .env 变量进行数据库连接

javascript - JavaScript 是否在内部将数组转换为对象?

javascript - Flask 应用程序未反射(reflect)新的 JS 更改

javascript - ng-repeat:在点击时显示一个项目并隐藏其他项目

javascript - 如何在嵌入式样式表中使用 javascript 变量作为背景?

javascript - 使用 pdf.js 和 ImageData 将 .pdf 渲染到单个 Canvas