我有一个JSON对象(数组数组),我需要按照特定的顺序进行过滤:
order: ['Hors','TTC','Total général', 'verger', ' Tra']
data = [[" Tra", "100 - 149 ch", "Total"]
[" Tra", "150 - 199 ch", "150 - 159 ch"]
[" Tra", "150 - 199 ch", "160 - 169 ch"]
[" Tra", "500 - 999 ch", "Total"]
[" Tra", "Total", ""]
["Comparable", "", ""]
["Hors", "", ""]
["TTC", "", ""]
["Total général", "", ""]
["vergers", " 1 - 49 ch", "20 - 29 ch"]
["vergers", " 1 - 49 ch", "30 - 39 ch"]
["vergers", " 1 - 49 ch", "40 - 49 ch"]
["vergers", " 50 - 99 ch", "70 - 79 ch"]]
我尝试使用sort(),但我不符合我的需要,并且某些字符串包含空格:
data.sort(function (a, b) {
return data.sort((a,b) => order.indexOf(a) - order.indexOf(b)) ;
});
此解决方案无法满足我的需求,但可以使同一对象静止
答案 0 :(得分:1)
如果您希望返回的所有数据均按顺序数组排序,则可以使用此类过滤器
order= ['Hors','TTC','Total général', 'vergers', ' Tra']
const data = [ [" Tra", "100 - 149 ch", "Total"], [" Tra", "150 - 199 ch", "150 - 159 ch"], [" Tra", "150 - 199 ch", "160 - 169 ch"], [" Tra", "500 - 999 ch", "Total"], [" Tra", "Total", ""], ["Comparable", "", ""], ["Hors", "", ""], ["TTC", "", ""], ["Total général", "", ""], ["vergers", " 1 - 49 ch", "20 - 29 ch"], ["vergers", " 1 - 49 ch", "30 - 39 ch"], ["vergers", " 1 - 49 ch", "40 - 49 ch"], ["vergers", " 50 - 99 ch", "70 - 79 ch"] ]
function sort(order){
result=[]
order.forEach(el =>result.push(data.filter(o=>el==o[0])));
result.unshift(data.filter(o=>!order.some(y=>y==o[0])))
return result.flat()
}
console.log(sort(order))
如果您只想对订单数组中的元素进行过滤和排序,可以尝试
order= ['Hors','TTC','Total général', 'vergers', ' Tra']
const data = [ [" Tra", "100 - 149 ch", "Total"], [" Tra", "150 - 199 ch", "150 - 159 ch"], [" Tra", "150 - 199 ch", "160 - 169 ch"], [" Tra", "500 - 999 ch", "Total"], [" Tra", "Total", ""], ["Comparable", "", ""], ["Hors", "", ""], ["TTC", "", ""], ["Total général", "", ""], ["vergers", " 1 - 49 ch", "20 - 29 ch"], ["vergers", " 1 - 49 ch", "30 - 39 ch"], ["vergers", " 1 - 49 ch", "40 - 49 ch"], ["vergers", " 50 - 99 ch", "70 - 79 ch"] ]
function sort(order){
result=[]
order.forEach(el =>result.push(data.filter(o=>el==o[0])));
return result.flat()
}
console.log(sort(order))
答案 1 :(得分:0)
如果要按每个数组的第一个元素排序,则应该可以:
(我将“ verger”更改为“ vergers”。我想那是一个错字)
var order = ['Hors','TTC','Total général', 'vergers', ' Tra']
var data = [
[" Tra", "100 - 149 ch", "Total"],
[" Tra", "150 - 199 ch", "150 - 159 ch"],
[" Tra", "150 - 199 ch", "160 - 169 ch"],
[" Tra", "500 - 999 ch", "Total"],
[" Tra", "Total", ""],
["Comparable", "", ""],
["Hors", "", ""],
["TTC", "", ""],
["Total général", "", ""],
["vergers", " 1 - 49 ch", "20 - 29 ch"],
["vergers", " 1 - 49 ch", "30 - 39 ch"],
["vergers", " 1 - 49 ch", "40 - 49 ch"],
["vergers", " 50 - 99 ch", "70 - 79 ch"]
];
data.sort((a,b) => order.indexOf(a[0]) - order.indexOf(b[0])) ;
console.log(data)
如果您还想过滤掉不匹配的元素:
var order = ['Hors','TTC','Total général', 'vergers', ' Tra']
var data = [
[" Tra", "100 - 149 ch", "Total"],
[" Tra", "150 - 199 ch", "150 - 159 ch"],
[" Tra", "150 - 199 ch", "160 - 169 ch"],
[" Tra", "500 - 999 ch", "Total"],
[" Tra", "Total", ""],
["Comparable", "", ""],
["Hors", "", ""],
["TTC", "", ""],
["Total général", "", ""],
["vergers", " 1 - 49 ch", "20 - 29 ch"],
["vergers", " 1 - 49 ch", "30 - 39 ch"],
["vergers", " 1 - 49 ch", "40 - 49 ch"],
["vergers", " 50 - 99 ch", "70 - 79 ch"]
];
data = data
.filter(x => order.indexOf(x[0]) > -1)
.sort((a,b) => order.indexOf(a[0]) - order.indexOf(b[0]));
console.log(data)
答案 2 :(得分:0)
const data = [
[" Tra", "100 - 149 ch", "Total"],
[" Tra", "150 - 199 ch", "150 - 159 ch"],
[" Tra", "150 - 199 ch", "160 - 169 ch"],
[" Tra", "500 - 999 ch", "Total"],
[" Tra", "Total", ""],
["Comparable", "", ""],
["Hors", "", ""],
["TTC", "", ""],
["Total général", "", ""],
["vergers", " 1 - 49 ch", "20 - 29 ch"],
["vergers", " 1 - 49 ch", "30 - 39 ch"],
["vergers", " 1 - 49 ch", "40 - 49 ch"],
["vergers", " 50 - 99 ch", "70 - 79 ch"]
]
function sequence(arr) {
return arr.filter(ele => ["Hors","TTC", "Total général"].some(val => val === ele[0]))
.concat(arr.filter(ele => ele[0] === "vergers"))
.concat(arr.filter(ele => ele[0] === " Tra"))
}
console.log(sequence(data));
答案 3 :(得分:0)
它不是indexOf(a)
/ indexOf(b)
,而是indexOf(a[0])
/ indexOf(b[0])
,因为您想比较每个数组的第一个元素,而不是整个数组。
const order = ['Hors','TTC','Total général', 'vergers', ' Tra'];
const data = [
[" Tra", "100 - 149 ch", "Total"],
[" Tra", "150 - 199 ch", "150 - 159 ch"],
[" Tra", "150 - 199 ch", "160 - 169 ch"],
[" Tra", "500 - 999 ch", "Total"],
[" Tra", "Total", ""],
["Comparable", "", ""],
["Hors", "", ""],
["TTC", "", ""],
["Total général", "", ""],
["vergers", " 1 - 49 ch", "20 - 29 ch"],
["vergers", " 1 - 49 ch", "30 - 39 ch"],
["vergers", " 1 - 49 ch", "40 - 49 ch"],
["vergers", " 50 - 99 ch", "70 - 79 ch"],
];
/* const weights = Object.fromEntries( */
/* order.map((k,i)=>[k,i]) */
/* ); */
/* console.log(weights); */
function sortByOrder(data, order) {
const weight = Object.fromEntries(
// Pre-cache indexOf(...)
order.map((k,i)=>[k,i])
);
return data.sort(
([a],[b])=>weight[a]-weight[b]
);
};
console.log(sortByOrder(data,order));
// [ [ 'Hors', '', '' ],
// [ 'TTC', '', '' ],
// [ 'Total général', '', '' ],
// [ 'vergers', ' 1 - 49 ch', '30 - 39 ch' ],
// [ 'vergers', ' 1 - 49 ch', '20 - 29 ch' ],
// [ 'Comparable', '', '' ],
// [ 'vergers', ' 50 - 99 ch', '70 - 79 ch' ],
// [ 'vergers', ' 1 - 49 ch', '40 - 49 ch' ],
// [ ' Tra', '150 - 199 ch', '150 - 159 ch' ],
// [ ' Tra', 'Total', '' ],
// [ ' Tra', '500 - 999 ch', 'Total' ],
// [ ' Tra', '150 - 199 ch', '160 - 169 ch' ],
// [ ' Tra', '100 - 149 ch', 'Total' ] ]