根据用户输入更新数组排序顺序



>我需要编写一个javascript函数,允许用户输入他们希望对象去的位置的排序顺序,然后固定当时具有该排序顺序的位置

var object = [{
sortOrder: 4,
id: "braves"
},{
sortOrder: 2,
id: "cubs"
},{
sortOrder: 3,
id: "marlins"
},{
sortOrder: 1,
id: "mets"
}]

用户请求将 id:"勇敢者"移动到排序顺序:1。

因此,它将把"勇敢者"放在排序顺序 1 中,然后在大都会、小熊、马林鱼上加 1,顺序将是:勇敢者、大都会、小熊、马林鱼现在。

我已经查看了sort()函数,但似乎它只是对其进行排序。如果大都会队和勇士队现在的排序顺序都是1,那么它怎么知道哪一个应该排在第一位而不是第二名呢?

在jquery/javascript中处理这个问题的最佳方法是什么

你可以试试这个,

function moveOrder(id,position){
object.find(item=>item.id===id).sortOrder=position;
object.forEach(item=>{
if(item.id!==id && item.sortOrder>=position)
item.sortOrder=item.sortOrder+1;
})
}

你可以使用map。

const object = [
{
sortOrder: 4,
id: 'braves',
},
{
sortOrder: 2,
id: 'cubs',
},
{
sortOrder: 3,
id: 'marlins',
},
{
sortOrder: 1,
id: 'mets',
},
];
function sortObject(id, nextSortOrder) {
return object.map((o) => {
if (o.id === id) {
return Object.assign({}, o, { sortOrder: nextSortOrder });
}
return Object.assign({}, o, {
sortOrder: o.sortOrder === object.length ? 1 : o.sortOrder + 1,
});
});
}
const sortedObject = sortObject('brave', 1);
console.log(sortedObject);

您可以将当前对象数组映射到新的对象数组,如果每个对象数组大于或等于提供的sortOrder,则每个sortOrder递增。然后,您可以使用.find()在数组中找到id等于提供的id的对象,以便将其sortOrder更改为提供的sortOrder的对象。最后,您可以重新调整新阵列:

function sortArr(arr, _sortOrder, _id) {
const new_arr = arr.map(({sortOrder, ...r}) => sortOrder >= _sortOrder ? {...r, sortOrder: sortOrder+1} : {...r, sortOrder});
const obj = new_arr.find(({id}) => id === _id);
obj.sortOrder = _sortOrder;

return new_arr.sort(({sortOrder:a}, {sortOrder:b}) => b-a);;
}
const arr = [{sortOrder:4,id:"braves"},{sortOrder:2,id:"cubs"},{sortOrder:3,id:"marlins"},{sortOrder:1,id:"mets"}];
console.log(sortArr(arr, 1, "braves"));