重新排列数组中的对象 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]));
我有 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]));