Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何基于另一个对象数组对一个对象数组进行排序_Javascript_Arrays_Sorting - Fatal编程技术网

Javascript 如何基于另一个对象数组对一个对象数组进行排序

Javascript 如何基于另一个对象数组对一个对象数组进行排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个动态调整大小的数组,它根据最后选择的数组位置0更改其顺序。问题是我想保持数组的原始顺序 为了做到这一点,我创建了一个附加变量,该变量被设置为数组的原始排序。尽管在选择项后数组的某些值可能会更改,但name属性永远不会更改。我想利用这个事实将新数组排序到原始位置 let keepRateOrder = rates.sort((a, b) => { return prevRates.indexOf(a.name) - prevRates.indexOf(b.name

我有一个动态调整大小的数组,它根据最后选择的数组位置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 ...}
]
这可以通过以下方法解决。在以下示例中,排序将根据
prevRates
数组将
Mail
放在第一位:

const rates=[
{name:'UPS',isChoosen:true,cost:63},
{name:'Mail',isChoosen:false,cost:23},
{name:'FedEx',isChoosen:false,cost:33}
];
常数预测率=[
{name:'Mail'},
{name:'UPS'},
{name:'联邦快递'},
];
让keepRateOrder=rates.sort((a,b)=>{
返回prevRates.findIndex(p=>p.name==a.name)-prevRates.findIndex(p=>p.name==b.name);
});

控制台日志(keepRateOrder)
首先使用
.map
先前的
转换为一个仅包含
名称
属性的数组,然后可以根据该名称数组使用
.sort

const prevRates=[
{name:'Mail',isChoosen:false,cost:23},
{name:'UPS',isChoosen:true,cost:63},
{name:'FedEx',isChoosen:false,cost:33}
];
常数率=[
{name:'UPS',isChoosen:true,cost:63},
{name:'Mail',isChoosen:false,cost:23},
{name:'FedEx',isChoosen:false,cost:33}
];
const prevRatesNames=prevRates.map(({name})=>name);
比率.排序((a,b)=>(
prevRatesNames.indexOf(a.name)-prevRatesNames.indexOf(b.name)
));

控制台日志(费率)
为每个项目添加一个新属性以跟踪原始索引,
originalIndex
。当您想要恢复原始订单时,使用该选项进行排序,以避免额外的副本。假设这就是你想做的

@p.s.w.g keepRatesOrder不正确,我的问题是将费率排序到与prevRates相同的顺序。prevRates只是更改前rates数组的一个副本。我只想把它恢复到原来的顺序。@user7659932哪一个是唯一的键?
名称
?@NikKyriakides是的,其余值受change@CertainPerformance有一个例子说明了prevRates可能是什么样子,两者之间的唯一区别是顺序,而未列出的其他一些属性可能不同。为什么不使用一个指向所选速率的变量点呢?每次有更新时,都会为每个变量设置isChoosen,相反,它可以只更新一个变量,或者如果未选择任何内容,则将其设置为null。