自定义javascript对象排序和维护索引关联

自定义javascript对象排序和维护索引关联,javascript,jquery,Javascript,Jquery,对象 var obj = { uniquestring1: { obj1: 'content', obj2: 'content' }, uniquestring2: { obj1: 'content' } } 所以我需要根据第一个父元素包含的元素数量对对象进行排序。使用.sort函数对我来说不是一个解决方案,因为我需要维护数组不保留的索引关联 结果应该是: var obj = { uniquestring2:

对象

var obj = {
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   },
   uniquestring2:
   {
       obj1: 'content'
   }
}
所以我需要根据第一个父元素包含的元素数量对对象进行排序。使用.sort函数对我来说不是一个解决方案,因为我需要维护数组不保留的索引关联

结果应该是:

var obj = {
   uniquestring2:
   {
       obj1: 'content'
   },
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   }
}
obj是散列而不是数组,因此无法对其进行排序。例如,obj[0];//没有定义。现在如果你有这个:

var obj = {
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   },
   uniquestring2:
   {
       obj1: 'content'
   }
};
var arr = [],

for(var i in obj) {
    arr.push(obj[i]);
}

arr.sort(function (a, b) {
   return Object.keys(a).length - Object.keys(b).length;
})
这样排序就可以了,因为obj是散列而不是数组,所以不能对它进行排序。例如,obj[0];//没有定义。现在如果你有这个:

var obj = {
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   },
   uniquestring2:
   {
       obj1: 'content'
   }
};
var arr = [],

for(var i in obj) {
    arr.push(obj[i]);
}

arr.sort(function (a, b) {
   return Object.keys(a).length - Object.keys(b).length;
})

然后,如果脚本对象没有排序顺序,因此无法对其进行排序,则该排序将起作用。要排序,您必须在某个地方有一个数组,而我在代码中没有看到任何数组

对象键没有定义的顺序

如果只需要有序访问,请使用数组。 如果只需要键控访问,请使用对象。 如果两者都需要访问,则可以使用并行阵列,但除非数据不发生更改,否则这是一个难题。 您可以一次性创建一个并行数组,其中包含按如下顺序排序的键引用:

var obj = {
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   },
   uniquestring2:
   {
       obj1: 'content'
   }
}

var objOrder = [];   // sorted arrays that contains first level keys into obj
var num;
for (var i in obj) {
    objOrder.push(i);  // get all keys into the array
    num = 0;
    for (var j in obj[i]) {
        ++num;         // count items in each key object
    }
    obj[i].keyCnt = num;   // save this for later sorting purposes
}
// now sort the parallel array by keyCnt
objOrder.sort(function(a, b) {
    return(obj[a].keyCnt - obj[b].keyCnt);
});
for (var i = 0; i < sortedOrder.length; i++ ) {
    var item = obj[sortedOrder[i]];
    // do something with item here
}
然后,要按排序顺序遍历关键点,您可以这样做:

var obj = {
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   },
   uniquestring2:
   {
       obj1: 'content'
   }
}

var objOrder = [];   // sorted arrays that contains first level keys into obj
var num;
for (var i in obj) {
    objOrder.push(i);  // get all keys into the array
    num = 0;
    for (var j in obj[i]) {
        ++num;         // count items in each key object
    }
    obj[i].keyCnt = num;   // save this for later sorting purposes
}
// now sort the parallel array by keyCnt
objOrder.sort(function(a, b) {
    return(obj[a].keyCnt - obj[b].keyCnt);
});
for (var i = 0; i < sortedOrder.length; i++ ) {
    var item = obj[sortedOrder[i]];
    // do something with item here
}

Javscript对象没有排序顺序,因此无法对其进行排序。要排序,您必须在某个地方有一个数组,而我在代码中没有看到任何数组

对象键没有定义的顺序

如果只需要有序访问,请使用数组。 如果只需要键控访问,请使用对象。 如果两者都需要访问,则可以使用并行阵列,但除非数据不发生更改,否则这是一个难题。 您可以一次性创建一个并行数组,其中包含按如下顺序排序的键引用:

var obj = {
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   },
   uniquestring2:
   {
       obj1: 'content'
   }
}

var objOrder = [];   // sorted arrays that contains first level keys into obj
var num;
for (var i in obj) {
    objOrder.push(i);  // get all keys into the array
    num = 0;
    for (var j in obj[i]) {
        ++num;         // count items in each key object
    }
    obj[i].keyCnt = num;   // save this for later sorting purposes
}
// now sort the parallel array by keyCnt
objOrder.sort(function(a, b) {
    return(obj[a].keyCnt - obj[b].keyCnt);
});
for (var i = 0; i < sortedOrder.length; i++ ) {
    var item = obj[sortedOrder[i]];
    // do something with item here
}
然后,要按排序顺序遍历关键点,您可以这样做:

var obj = {
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   },
   uniquestring2:
   {
       obj1: 'content'
   }
}

var objOrder = [];   // sorted arrays that contains first level keys into obj
var num;
for (var i in obj) {
    objOrder.push(i);  // get all keys into the array
    num = 0;
    for (var j in obj[i]) {
        ++num;         // count items in each key object
    }
    obj[i].keyCnt = num;   // save this for later sorting purposes
}
// now sort the parallel array by keyCnt
objOrder.sort(function(a, b) {
    return(obj[a].keyCnt - obj[b].keyCnt);
});
for (var i = 0; i < sortedOrder.length; i++ ) {
    var item = obj[sortedOrder[i]];
    // do something with item here
}

无法对对象的属性进行排序,因为它们不是有序数组。也许您想按特定顺序迭代属性?实现一些排序算法,如果不适合您的情况,请不要使用jquery.sort。无法对对象的属性进行排序,因为它们不是有序数组。也许您想按特定顺序迭代属性?实现一些排序算法,如果不适合您的情况,请不要使用jquery.sort。我当然知道,这就是为什么我在这里要求一个解决办法。@keepwalking:你为什么要找一个解决办法?这个怎么了?如果需要标签,应该将对象包装在另一个对象中:{label:'uniquestring1',value:{obj1:'content',obj2:'content'}请记住,旧浏览器(如IE6-IE8)不支持对象的.keys属性。我当然知道,这就是我在这里要求解决方法的原因。@keepwalking:为什么要寻找解决方法?这有什么问题?如果需要标签,应该将对象包装到另一个对象中:{label:'uniquestring1',value:{obj1:'content',obj2:'content'}请记住,旧浏览器(如IE6-IE8)不支持对象的.keys属性。