代码之家  ›  专栏  ›  技术社区  ›  John

非匿名命名函数,用于按指定的子键值对多维对象进行排序

  •  0
  • John  · 技术社区  · 2 年前

    我有一个对象(不是数组):

    var people = {};
    people['Zanny'] = {date: 447, last: 'Smith'};
    people['Nancy'] = {date: 947, last: 'William'};
    people['Jen'] = {date: 147, last: 'Roberts'};
    

    不像 this generic sorting question 我需要指定按哪个子键的值排序,在这种情况下: date .为了简单起见,我删除了日期的前七位,因为这并不重要。

    排序后,对象应按 日期 关键点如下:

    people['Jen'] = {date: 147, last: 'Roberts'};//147 is the lowest/first value.
    people['Zanny'] = {date: 447, last: 'Smith'};
    people['Nancy'] = {date: 947, last: 'William'};//947 is the highest/last value.
    

    我需要创建一个可重用的非匿名 命名函数 有两个明显的参数: object 还有 key 排序所基于的值。我已经花了一些时间尝试了以下几点,但都没有成功:

    function array_sort_by_values(o, k)
    {
     return Object.entries(o).sort().reduce(function (result, key)
     {
      //console.log(result,key);
      result[key][k] = o[key][k]; return result;
     }, {});
    }
    
    • 我不能用 o.sort 对于数组类型也是如此(尽管JavaScript声称一切都是一个对象,“数组”并不存在)。
    • 我不能过分强调,我必须能够指定密钥的名称,因为我需要使用这种排序形式来处理一些不同的事情。我错过了什么?
    • 绝对没有框架或库。
    1 回复  |  直到 2 年前
        1
  •  1
  •   John    2 年前

    如何将对象转换为数组以进行排序和转换?

    var people = {};
    people['Zanny'] = {date: 447, last: 'Smith'};
    people['Nancy'] = {date: 947, last: 'William'};
    people['Jen'] = {date: 147, last: 'Roberts'};
    console.log(Object.fromEntries(Object.entries(people).sort((a,b) => {
        return a[1].date - b[1].date
      })))

    var people = {};
    people['Zanny'] = {date: 447, last: 'Smith'};
    people['Nancy'] = {date: 947, last: 'William'};
    people['Jen'] = {date: 147, last: 'Roberts'};
    console.log(Object.fromEntries(Object.entries(people).sort(([,a],[,b]) => {
        return a.date - b.date
      })))

    作为命名函数:

    function array_sort_by_values(o, k)
    {
     return Object.fromEntries(Object.entries(o).sort((a,b) => {return a[1][k] - b[1][k]}));
    }
    

    保持 必须重新分配对象的实际更改:

    people = array_sort_by_values(people, 'date');
    console.log(people);
    
    array_sort_by_values(people, 'last')
    console.log(people);