2017-03-05 18 views
1

我想使用Javascript排序一个JSON项目由其他数组,并按字母顺序排序其余项目请。使用Javascript排序JSON的另一个数组,其余的按字母顺序

我有秩序的数组我想要得到的JSON项目:

var order = [3,9,50,7]; 

而且具有“ID”键JSON,我想使用的顺序排列排序,和的休息请使用“名称”键不匹配的项目。

这里是原来的JSON:

var data = [ 
    { 
     "id": "9", 
     "title": "B" 
    }, 
    { 
     "id": "63", 
     "title": "Z" 
    }, 
    { 
     "id": "433", 
     "title": "D" 
    }, 
    { 
     "id": "50", 
     "title": "A" 
    }, 
    { 
     "id": "2", 
     "title": "G" 
    } 
] 

这是最终的结果,我希望它是这样的:

var data = [ 
    { 
     "id": "9", 
     "title": "B" 
    }, 
    { 
     "id": "50", 
     "title": "A" 
    }, 
    { 
     "id": "433", 
     "title": "D" 
    }, 
    { 
     "id": "2", 
     "title": "G" 
    }, 
    { 
     "id": "63", 
     "title": "Z" 
    } 
] 

回答

0

试试这个:

var order = [3,9,50,7]; 
var data = [ 
    { 
     "id": "9", 
     "title": "B" 
    }, 
    { 
     "id": "63", 
     "title": "Z" 
    }, 
    { 
     "id": "433", 
     "title": "D" 
    }, 
    { 
     "id": "50", 
     "title": "A" 
    }, 
    { 
     "id": "2", 
     "title": "G" 
    } 
] 
    let sortedArray = data.sort((a, b) => { 
      return ((order.indexOf(a.id) || Number.Max_VALUE) - (order.indexOf(b.id) || Number.MAX_VALUE) || a.title.localeCompare(b.title)) 
     }) 
     console.log(sortedArray) 
+0

怎么做,在'order'到列表的头部IDS这种项目? –

+1

@DanO你说得对。更新了我的答案。 – nitte93user3232918

2

你可以使用一个用于排序顺序的对象和用于将其他标识移动到结尾的默认值。

var order = [3, 9, 50, 7], 
 
    data = [{ id: "9", title: "B" }, { id: "63", title: "Z" }, { id: "433", title: "D" }, { id: "50", title: "A" }, { id: "2", title: "G" }], 
 
    orderO = {}; 
 

 
order.forEach(function (a, i, aa) { 
 
    orderO[a] = i - aa.length; // use negative values and zero as default 
 
}); 
 

 
data.sort(function (a, b) { 
 
    return (orderO[a.id] || 0) - (orderO[b.id] || 0) || a.title.localeCompare(b.title); 
 
}); 
 

 
console.log(data); 
 
console.log(orderO);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

非常感谢Nina,似乎很好用! :)我也在检查这里提供的其他答案,看看哪一个是最有效的。 –

1

首先找到你data阵列符合您order阵列的项目。然后使用自定义排序算法对剩余项目进行排序,并将结果连接起来。

var order = [3, 9, 50, 7]; 
 
var data = [{ "id": "9", "title": "B" }, { "id": "63", "title": "Z" }, { "id": "433", "title": "D" }, { "id": "50", "title": "A" }, { "id": "2", "title": "G" }]; 
 

 
function sortArr(arr, order) { 
 
    var newArr = []; 
 
    for (var i = 0; i < order.length; i++) { 
 
     var index = arr.findIndex(x => x.id === order[i].toString()); 
 
     if (index >= 0) { 
 
      newArr.push(arr.splice(index, 1)); 
 
     } 
 
    } 
 

 
    return newArr.concat(arr.sort((a, b) => a.title > b.title ? 1 : -1)); 
 
} 
 
console.log(sortArr(data, order));

1

您可以将订单阵列的第一减少到一个对象,其中关键的是元素和值是数组索引。然后使用排序首先按数组中的元素排序,然后按数组中的位置排序它们,最后按标题排序其他元素。

var data = [{"id":"9","title":"B"},{"id":"63","title":"Z"},{"id":"433","title":"D"},{"id":"50","title":"A"},{"id":"2","title":"G"}] 
 

 
var order = [3,9,50,7].reduce(function(r, e, i) { 
 
return r[e] = i, r 
 
}, {}) 
 

 
var result = data.sort(function(a, b) { 
 
return ((order[b.id] != undefined) - (order[a.id] != undefined) || (order[a.id] - order[b.id])) || 
 
    \t a.title.localeCompare(b.title) 
 
}) 
 

 
console.log(result)

0

可以在一个排序函数来完成。使用Array.indexOf获取一个值,以排序顺序数组中的id。如果只有一个物品在订单数组中,它总是向上移动。所有其他案例按字母顺序排序。

var order = [3,9,50,7]; 
 

 
var data = [ 
 
    {id: "9", title: "B"}, 
 
    {id: "63", title: "Z"}, 
 
    {id: "433", title: "D"}, 
 
    {id: "50", title: "A"}, 
 
    {id: "2",title: "G"}, 
 
    {id: "9",title: "F"}, 
 
    {id: "7",title: "D"}, 
 
    {id: "3",title: "E"}, 
 
    {id: "2",title: "F"}, 
 
] 
 
// the sort function 
 
function sortFunc(a,b){ 
 
    var iA = order.indexOf(Number(a.id))+1; // get index of A 
 
    var iB = order.indexOf(Number(b.id))+1; // get index of B 
 
    if(iA && iB){ // if both in the order array 
 
     return iA === iB ? // if the same in order array then sort alphabet 
 
      a.title.localeCompare(b.title) : 
 
      iA - iB; 
 
    } 
 
    // if A or B in order array move up else sort alphabet 
 
    return iA ? -1 : iB ? 1 : a.title.localeCompare(b.title); 
 
} 
 
// sort data 
 
data.sort(sortFunc); 
 
// dispay result 
 
data.forEach(obj=>console.log(obj.id + ":" + obj.title))