array.sort无法处理对象数组

时间:2015-11-25 08:45:03

标签: javascript sorting

我得到了以下对象数组:

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)无法在控制台中打印。

2 个答案:

答案 0 :(得分:1)

所以变量arr是一个数组,但据我所知,它只包含一个对象。

你试图直接对数组进行排序,因为它只有一个对象,它根本就不会排序,因为没有什么可以排序。

您需要访问arr[0],它是包含您要排序的实际对象的对象,但Object原型不包含任何数组函数,因此您无法调用{{1即使在技术上,sortArrayObject继承自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/

的演示