如何使排序功能解决这个问题?

时间:2020-04-08 20:47:11

标签: javascript arrays node.js object

我有对象数组。每个对象都包含名称和user_id属性。

const queue = [
  {
    user: 1,
    song: "Song1",
  },
  {
    user: 1,
    song: "Song2",
  },
  {
    user: 2,
    song: "Song3",
  },
  {
    user: 1,
    song: "Song4",
  },
  {
    user: 3,
    song: "Song5",
  },
];

我想对它进行排序,使其看起来像这样

const queue = [
  {
    user: 1,
    song: "Song1",
  },
  {
    user: 2,
    song: "Song3",
  },
  {
    user: 3,
    song: "Song5",
  },
  {
    user: 1,
    song: "Song2",
  },

  {
    user: 1,
    song: "Song4",
  },

];

所以。如果用户1将10首歌曲添加到队列中,用户2将1首歌曲添加到队列中,而用户3将3首歌曲添加到队列中,则队列看起来像user_1_entry,user_2_entry,user_3_entry,user_1_entry,user_3_entry,user_1_entry, user_3_entry, user_1_entry [...]

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您可以通过将具有哈希表的临时对象用于同一组数组来使用sorting with map。将使用的数组的长度作为组进行排序。

排序与组和索引有关。

结果与已排序的临时数组的索引映射。

const
    queue = [{ user: 1, song: "Song1" }, { user: 1, song: "Song2" }, { user: 2, song: "Song3" }, { user: 1, song: "Song4" }, { user: 3, song: "Song5" }],
    groups = Object.create(null),
    result = queue
        .map(({ user }, index) => ({ index, group: groups[user] = (groups[user] || 0) + 1 }))
        .sort((a, b) => a.group - b.group || a.index - b.index)
        .map(({ index }) => queue[index]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

Fast and less iteration。根据用户进行分组,并从所有用户中一一收集歌曲

    const queue = [
      { user: 1, song: "Song1" },
      { user: 1, song: "Song2" },
      { user: 2, song: "Song3" },
      { user: 1, song: "Song4" },
      { user: 3, song: "Song5" },
    ];
    const mapper = (data) => {
      return data.reduce((m, i) => {
        if (!m[i.user]) m[i.user] = [];
        m[i.user].push(i);
        return m;
      }, []);
    };
    const collect = (queue) => {
      const mappedData = mapper(queue);
      let result = [],
        counter = 0,
        row = 0;
      while (counter < queue.length) {
        if (mappedData[row] && mappedData[row].length) {
          const d = mappedData[row].shift();
          result.push(d);
          counter++;
        }
        row++;
        if (row === mappedData.length) row = 0;
      }
      return result;
    };
    console.log(collect(queue));
    // chunkSort(queue);