重新排列数组中的对象 JavaScript

Rearrange object in an array JavaScript

我有 PriorityArray 作为

[1, 2, 3]

和响应 json 为

[ {
Id: 1,
Name:”aaa”,
Priority:1
},
{
Id: 2,
Name:”bbb”,
Priority:1
},
{
Id: 3,
Name:”ssss”,
Priority:2
},
{
Id: 4,
Name:”aaa”,
Priority:2
},
{
Id: 5,
Name:”dddd”,
Priority:1
},
{
Id: 6,
Name:”dddd”,
Priority:3
}]

我想根据优先级轮换排列所有对象。产品应排列在 1,2,3 之类的数组中,然后再次附加优先级为 1,2,3

的下一个产品

预期输出:

[ {
Id: 1,
Name:”aaa”,
Priority:1
},
{
Id: 3,
Name:”ssss”,
Priority:2
},
{
Id: 6,
Name:”dddd”,
Priority:3
}
{
Id: 2,
Name:”bbb”,
Priority:1
},
{
Id: 4,
Name:”aaa”,
Priority:2
},
{
Id: 5,
Name:”dddd”,
Priority:1
},
]
  • 按优先级对响应对象进行分组。

  • 然后找到编号最高的组。其中的项目数。

  • 然后遍历分组数组,直到所有元素都添加到最终数组。

const priority = [1, 2, 3];
const res = [
  { Id: 1, Name: "aaa", Priority: 1 },
  { Id: 2, Name: "bbb", Priority: 1 },
  { Id: 3, Name: "ssss", Priority: 2 },
  { Id: 4, Name: "aaa", Priority: 2 },
  { Id: 5, Name: "dddd", Priority: 1 },
  { Id: 6, Name: "dddd", Priority: 3 },
];

const resGroupedByPriority = priority.map((p) =>
  res.filter((r) => r.Priority === p)
);

let index = 0;
let maxIndex = Math.max(...resGroupedByPriority.map((p) => p.length));
let ordered = [];

while (index < maxIndex) {
  resGroupedByPriority.forEach((p) => {
    if (p[index]) {
      ordered.push(p[index]);
    }
  });
  index += 1;
}
console.log(ordered);

您可以为索引获取一个对象并创建一个新数组并对其进行过滤。

const
    order = [1, 2, 3],
    data = [{ Id: 1, Name: 'aaa', Priority: 1 }, { Id: 2, Name: 'bbb', Priority: 1 }, { Id: 3, Name: 'ssss', Priority: 2 }, { Id: 4, Name: 'aaa', Priority: 2 }, { Id: 5, Name: 'dddd', Priority: 1 }, { Id: 6, Name: 'dddd', Priority: 3 }],
    indices = Object.fromEntries(order.map((k, v) => [k, v])),
    result = data
        .reduce((r, o) => {
            r[indices[o.Priority]] = o;
            indices[o.Priority] += order.length;
            return r;
        }, [])
        .filter(Boolean);

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

一种不同的方法。

const
    order = [1, 2, 3],
    data = [{ Id: 1, Name: 'aaa', Priority: 1 }, { Id: 2, Name: 'bbb', Priority: 1 }, { Id: 3, Name: 'ssss', Priority: 2 }, { Id: 4, Name: 'aaa', Priority: 2 }, { Id: 5, Name: 'dddd', Priority: 1 }, { Id: 6, Name: 'dddd', Priority: 3 }],
    temp = data.reduce((r, o) => {
        (r[o.Priority] ??= []).push(o);
        return r;
    }, {}),
    result = [];

let i = 0, go = true;

while (go) {
    go = false;
    for (const k of order) {
        if (!temp[k].length) break;
        result.push(temp[k].shift());
        go ||= temp[k].length;
    }
}


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

这是我想出来的,虽然很粗糙,但效果很好。

const testList = [
  { Id: 1, Name: "aaa", Priority: 1 },
  { Id: 2, Name: "bbb", Priority: 1 },
  { Id: 3, Name: "ssss", Priority: 2 },
  { Id: 4, Name: "aaa", Priority: 2 },
  { Id: 5, Name: "dddd", Priority: 1 },
  { Id: 6, Name: "dddd", Priority: 3 },
];

function prioritySort(arr, priority) {
  arr = arr.slice(); //copies the array

  let result = [];
  let p = priority[0];
  let c = 0;

  while (arr.length > 0 || c > 10000) {
    c++;

    for (let curr in arr) {
      if (arr[curr].Priority == p) {
        result.push(arr[curr]);

        arr.splice(curr, 1);

        break;
      }
    }

    if (c == priority.length) {
      p = priority[0];
      c = 0;
    } else {
      p = priority[c];
    }
  }

  return result;
}

console.log(prioritySort(testList, [1, 2, 3]));