如何根据另一个对象数组对一个对象数组进行排序

use*_*932 4 javascript arrays sorting

我有一个动态调整大小的数组,它根据最后选择的数组位置 0 的内容来更改其顺序。问题是我想保留数组的原始顺序。

为此,我创建了一个附加变量,该变量设置为数组的原始排序。尽管在选择项目后数组的某些值可能会发生变化,但 name 属性永远不会改变。我想利用这个事实将新数组排序到原始位置。

let keepRateOrder = rates.sort((a, b) => {  
        return prevRates.indexOf(a.name) - prevRates.indexOf(b.name);
      });


const rates = [
{name:'UPS', isChoosen:true, cost:63 ...},
{name:'Mail', isChoosen:false, cost:23 ...},
{name:'FedEx', isChoosen:false, cost:33 ...}
]


const prevRates = [
{name:'Mail', isChoosen:false, cost:23 ...},
{name:'UPS', isChoosen:true, cost:63 ...},
{name:'FedEx', isChoosen:false, cost:33 ...}
]
Run Code Online (Sandbox Code Playgroud)

p.s*_*w.g 7

这可以使用 来解决findIndex。在以下示例中,排序将Mail按照prevRates数组放在第一位:

const rates = [
  {name:'UPS', isChoosen:true, cost:63},
  {name:'Mail', isChoosen:false, cost:23},
  {name:'FedEx', isChoosen:false, cost:33}
];

const prevRates = [
  {name: 'Mail'},
  {name: 'UPS'},
  {name: 'FedEx'},
];

let keepRateOrder = rates.sort((a, b) => {
  return prevRates.findIndex(p => p.name === a.name) - prevRates.findIndex(p => p.name === b.name);
});

console.log(keepRateOrder);
Run Code Online (Sandbox Code Playgroud)

indexOf如果你先这样做,你也可以完成同样的事情map。这会导致代码更加清晰:

const rates = [
  {name:'UPS', isChoosen:true, cost:63},
  {name:'Mail', isChoosen:false, cost:23},
  {name:'FedEx', isChoosen:false, cost:33}
];

const prevRates = [
  {name: 'Mail'},
  {name: 'UPS'},
  {name: 'FedEx'},
].map(x => x.name);

let keepRateOrder = rates.sort((a, b) => {
  return prevRates.indexOf(a.name) - prevRates.indexOf(b.name);
});

console.log(keepRateOrder);
Run Code Online (Sandbox Code Playgroud)

这是另一种解决方案,仅使用原始索引的哈希值,使用以下命令创建reduceRight

const rates = [
  {name:'UPS', isChoosen:true, cost:63},
  {name:'Mail', isChoosen:false, cost:23},
  {name:'FedEx', isChoosen:false, cost:33}
]

const prevRates = [
  {name: 'Mail'},
  {name: 'UPS'},
  {name: 'FedEx'},
].reduceRight((a, x, i) => (a[x.name] = i, a), {});

let keepRateOrder = rates.sort((a, b) => {
  return prevRates[a.name] - prevRates[b.name];
});

console.log(keepRateOrder);
Run Code Online (Sandbox Code Playgroud)

既然您说过可以从原始数组中添加或删除项目,请注意,上述所有解决方案都将首先放置新项目(因为它们在数组中的索引prevRates将返回为-1)。如果您希望新项目出现在末尾,您需要执行以下操作:

const rates = [
  {name:'UPS', isChoosen:true, cost:63},
  {name:'Mail', isChoosen:false, cost:23},
  {name:'Foo'},
  {name:'FedEx', isChoosen:false, cost:33},
];

const prevRates = [
  {name: 'Mail'},
  {name: 'UPS'},
  {name: 'FedEx'},
].map(x => x.name);

let keepRateOrder = rates.sort((a, b) => {
  const aIndex = prevRates.indexOf(a.name);
  const bIndex = prevRates.indexOf(b.name);
  return (aIndex === -1 ? Number.MAX_VALUE : aIndex) - (bIndex === -1 ? Number.MAX_VALUE : bIndex);
});

console.log(keepRateOrder);
Run Code Online (Sandbox Code Playgroud)