Javascript 仅对数组中的对进行排序

Javascript 仅对数组中的对进行排序,javascript,html,typescript,web,Javascript,Html,Typescript,Web,我有一个对象数组,例如: const arr = [ { type: 2, name: 'A', }, { type: 1, name: 'B'}, { type: 2, name: 'C'}, { type: 1, name: 'D', }, ]; 现在你看不到的是,有成对的物体。所以“A”和“B”应该在一起。现在我想对这个数组进行排序,所以最后它变成: const result = [ {

我有一个对象数组,例如:

  const arr = [
  {
    type: 2,
    name: 'A',
  },
  {
    type: 1, 
    name: 'B'},
  {
    type: 2, 
    name: 'C'},
  {
    type: 1,
    name: 'D',
  },
];
现在你看不到的是,有成对的物体。所以“A”和“B”应该在一起。现在我想对这个数组进行排序,所以最后它变成:

const result = [
  {
    type: 1,
    name: 'B',
  },
  {
    type: 2, 
    name: 'A'},
  {
    type: 1, 
    name: 'D'},
  {
    type: 2,
    name: 'C',
  },
];
所以基本上我只想对这对进行排序

我试着像这样使用索引


基本上只使用模运算符作为当前值的索引,但我担心排序机制的工作方式有点不同。

我假设
arePair(a,b)
是一个函数,它包含关于对象对的信息,如果参数是pair,则返回true(我们不知道您所写的有问题的信息,但在snipped中我给出了一些示例)。我还假设您希望按
类型对成对进行排序

arr.sort((a,b) => arePair(a,b) ? a.type-b.type : 0 );
const arr=[
{
类型:2,
名称:‘A’,
},
{
类型:1,
名称:'B'},
{
类型:2,
名称:'C'},
{
类型:1,
名称:“D”,
},
];
常量arePair=(a,b)=>[{'a':1,'b':1},{'C':1,'D':1}];
arr.sort((a,b)=>arePair(a,b)?a.type-b.type:0);

console.log(arr);
我对你的问题的解释是,你的数组是一个扁平的元素对列表,你希望每对元素按
类型进行排序。为此,我将引入
chunk()
操作和
扁平化()
操作

chunk(arr,chunksise)
函数获取一个数组
arr
并将其拆分为长度
chunkSize
,因此
chunk([1,2,3,4,5,6],3)
[[1,2,3],[4,5,6]]
。它可以用多种方式编写;这里有一种:

const chunk = <T>(arr: T[], chunksize: number) =>
  arr.reduce<T[][]>(
    (acc, cur) => (
      acc[acc.length - 1].length < chunksize || acc.push([]),
      acc[acc.length - 1].push(cur),
      acc
    ),
    [[]]
  );
const flatten = <T>(arr: T[][]) =>
  arr.reduce<T[]>((acc, cur) => (acc.push(...cur), acc), []);
最后,对于要执行的操作,我们将采用
arr
,将其分为几对,按元素的
类型
属性对每对进行排序,并将结果展平:

const result = flatten(chunk(arr, 2).map(e => e.sort((a, b) => a.type - b.type)));
让我们确保这是你想要的:

console.log(JSON.stringify(result));
// [{"type":1,"name":"B"},{"type":2,"name":"A"},
//  {"type":1,"name":"D"},{"type":2,"name":"C"}]
看起来不错。希望对你有帮助;祝你好运


通过配对,您可以拼接连接的项目,排序并将其拼接回阵列

var数组=[{type:2,名称:'A'},{type:1,名称:'B'},{type:2,名称:'C'},{type:1,名称:'D'}],
尺寸=2,
i=0;
while(ia.type-b.type));
i+=尺寸;
}
console.log(数组);

。作为控制台包装器{max height:100%!important;top:0;}
您能详细解释一下您想要什么吗?这样“A”和“B”就属于一个整体了-为什么/如何?请帮助我们理解有关成对的部分。它们成对是因为它们在列表中彼此相邻?还是因为它们在某些其他数据结构中成对?听起来好像您想按类型排序,然后按名称排序,但您没有一个断开列来告诉排序何时开始再次计数。您找到的映射是如果知道原始顺序没有帮助,则可能没有帮助。也许可以看看多维数组。@undrline“听起来你想按类型排序,然后按名称排序”-否。结果的顺序是
1/B、2/A、1/D、2/C
而不是
1B、1D、2A、2C