我怎么排序基于对象的另一个数组对象的数组

问题描述 投票:1回答:3

我有一个基于对什么是最后的选择到阵列的0位置,改变其顺序的动态调整大小的数组。问题是,我想保持阵列的原始顺序。

为了做到这一点,我已经创建了被设置为阵列的原始排序的附加变量。虽然有些数组的值可能会在项目的选择后更改的名称属性从来不会。我想利用这一点来的新阵原来的位置排序。

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 ...}
]
javascript arrays sorting
3个回答
2
投票

这可以使用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);

你可以完成同样的事情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);

而这里只是使用原始指标的散列,使用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);

既然你说,项目可以添加或从原始数组中删除,请注意,上述所有的解决方案将首先把新的项目(因为他们的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);

0
投票

首先使用.map改造prevRates逼到name属性数组,然后你可以使用基于.sort名字是阵列上:

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

const prevRatesNames = prevRates.map(({ name }) => name);
rates.sort((a, b) => (
  prevRatesNames.indexOf(a.name) - prevRatesNames.indexOf(b.name)
));
console.log(rates);

请记住,.sort各种就地 - 如果你这样做

let keepRateOrder = rates.sort...

然后keepRateOrder将只是另一个参考rates阵列。如果你想要一个副本,而不是突变原rates阵列,那么你就必须要浅拷贝rates第一:

const keepRateOrder = rates.slice().sort...

0
投票

如何添加新的属性,以每个项目跟踪原来的指数,originalIndex。排序使用,当你想在原来的顺序背,避免了额外的副本。假设这就是你想要做什么!

© www.soinside.com 2019 - 2024. All rights reserved.