在JavaScript中按字母顺序对对象数组进行排序

时间:2019-04-11 15:39:51

标签: javascript sorting

我正在尝试按字母顺序对链接的名称进​​行排序,但是它表示 level2.sort不是函数,感谢您的帮助!

for (let i = 0, l = finalData.length; i < l; i++) {
        const level1 = finalData[i];
        console.log('This is level 1', level1);
        for (let x = 0, y = finalData[i].links.length; x < y; x++) {
            const level2 = finalData[i].links[x];
            level2.sort((a, b) => a.name - b.name);
            console.log('This is level 2', level2);
        }
    }
  

[0]的1级是{title:“ resources”,links:Array(3)}

     

[0]的2级是{name:“ google”,路径:“ www.google.com”}

     

[1]上的2级是{name:“ yahoo”,路径:“ www.yahoo.com”}

     

[2]的2级是{name:“ apple”,path:“ www.apple.com”}

     
     

[1]的1级是{title:“ TeacherEmails”,links:Array(2)}

     

位于[0]的2级是{name:“ JoneA”,路径:“ JoneA@yahoo.com”}

     

位于[1]的2级是{name:“ AndyK”,路径:“ AndyK@apple.com”}

     

以此类推

2 个答案:

答案 0 :(得分:1)

您在这里太深了: const level2 = finalData[i].links[x];

这使level2不能成为无法排序的数组。

删除索引访问器: finalData[i].links;

您也不需要第二个for循环。

并使用MDN中的字符串排序:

// sort by name
items.sort(function(a, b) {
  var nameA = a.name.toUpperCase(); // ignore upper and lowercase
  var nameB = b.name.toUpperCase(); // ignore upper and lowercase
  if (nameA < nameB) {
    return -1;
  }
  if (nameA > nameB) {
    return 1;
  }

  // names must be equal
  return 0;
});

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

您的循环将如下所示:

for (let i = 0; i < finalData.length; i++) {
    finalData[i].links.sort((a, b) => {
        var nameA = a.name.toUpperCase(); // ignore upper and lowercase
        var nameB = b.name.toUpperCase(); // ignore upper and lowercase
        if (nameA < nameB) {
           return -1;
        }
        if (nameA > nameB) {
           return 1;
        }

        // names must be equal
        return 0;
    }
}

答案 1 :(得分:0)

由于level2不是数组对象,而是类似数组的Arguments object,所以出现此错误。

如果您可以使用外部库,例如lodash,则可以使用orderBy方法进行排序:

_.orderBy(level2, ['name'], ['asc']);