我得到了以下对象数组:
var arr = [{
2: {
1: { name: "test" },
2: { name: "apple" }
},
3: {
1: { name: "banana" },
2: { name: "pear" }
}
}];
只是一些示例数据。现在,我得到了3个textareas:
<textarea id="first"></textarea>
<textarea id="second"></textarea>
<textarea id="third"></textarea>
我有以下定制功能:
function sort(alt)
{
arr.sort(function (a,b)
{
console.log(a);
if (a[2].name < a[2].name)
return (alt) ? 1 : -1;
if (a[2].name > a[2].name)
return (alt) ? -1 : 1;
return 0;
});
}
它应该根据参数按名称,升序或降序对对象数组进行排序。现在,我遇到了2个问题。这样我将所有值附加到textareas:
for (var key in arr[0])
{
var obj = arr[0][key];
$(ID).append(obj[2].name + '\n');
}
第一次,该代码将在不运行sort
的情况下执行。第二次,sort
将以false
作为参数执行,而不是执行该代码。第三次sort
将以true
作为参数执行,而不是执行该代码。但是,所有文本框的输出完全相同。
这是jsfiddle的链接:
http://jsfiddle.net/JoshB1997/gow4vzsc/
此外,console.log(a)
无法在控制台中打印。
答案 0 :(得分:1)
所以变量arr
是一个数组,但据我所知,它只包含一个对象。
你试图直接对数组进行排序,因为它只有一个对象,它根本就不会排序,因为没有什么可以排序。
您需要访问arr[0]
,它是包含您要排序的实际对象的对象,但Object
原型不包含任何数组函数,因此您无法调用{{1即使在技术上,sort
是Array
和Object
继承自Array
,而不是相反,因此来自Object
的方法可用到Object
而不是相反。
此外,您尝试将相同的Array
与自身进行比较,因此它始终为假,因为它相等,而不是a[2].name
或>
。
在您的情况下,我从每个嵌套对象中提取所有<
属性(考虑原始name
的用法):
arr
现在您可以使用compare数组正确输出已排序的名称。 还 - 你的建筑似乎过于复杂?它有对象,其中有嵌套对象,但你只是排序和显示名称,是否有必要维护这个结构的原因?
如果不是我强烈建议你简化这个只是一个名字数组,我上面做的循环远非美丽,我宁愿让你不要使用它,因为它假设最外面的对象是一个填充的对象与其他所有具有var compare = [];
var alt = false;
for (k in arr[0]) {
if (arr[0].hasOwnProperty(k)) {
for (l in arr[0][k])
if (arr[0][k].hasOwnProperty(l))
compare.push(arr[0][k][l].name);
compare.sort(function(a, b) {
if (a == b)
return 0;
else if (a < b)
return alt ? 1 : -1
else
return alt ? -1 : 1
});
属性的对象。此代码仍然可以在没有额外name
的情况下中断。
无论哪种方式,arr[0][k][l].hasOwnProperty('name')
数组只包含所有名称,如果您不为自己创建复杂的内容,它可以使用默认的compare
轻松排序。
答案 1 :(得分:0)
我建议你使用包含非常有用的函数的http://underscorejs.org/来从对象转换为数组。
例如,在这种情况下,您可以使用http://underscorejs.org/#values
之类的内容let values = _.values(arr[0]);
现在,value是一个包含
形式的两个对象(2,3)的数组values = [
{
1: {
name: "test"
},
2: {
name: "apple"
}
},
{
1: {
name: "banana"
},
2: {
name: "pear"
}
}
]
在这里你可以调用你的排序功能
我的代码中有使用underscore.js http://jsfiddle.net/gow4vzsc/3/
的演示编辑:如果您不能/不想包含整个库,您可以编写代码来获取值:
values = [];
for(key in arr[0]){
values.push(arr[0][key]);
}
这是一个没有下划线.js http://jsfiddle.net/3L7ttu2r/1/
的演示