我有以下对象数组:
dfAC_Renew['date_difference'] = dfAC_Renew.apply(get_date_difference, x = 'customer_since_date', y = 'renewal_date', axis = 1)
我想根据类型的值对数组元素进行排序。如果type为'choice',我想将元素放置在数组的最后一位,即第四位。如果type为'boolean',则将其放在第三位。如果类型为“选择”,则将其放在第二位。
我知道如何用数值对数组进行排序。
[
0: {
id: 1,
type: 'input'
},
1: {
id: 2,
type: 'boolean'
},
2: {
id: 3,
type: 'choice'
},
3: {
id: 1,
type: 'select'
},
]
我无法比较属性值并对其进行排序。
请帮助我。任何帮助将不胜感激。
此致
答案 0 :(得分:1)
通常,如果需要根据对象的某些字符串属性对数组进行排序,则需要创建另一个代表排序顺序的数组。然后使用indexOf
减去索引
const order = ['input', 'select', 'boolean','choice'];
const arr = [
{
id: 1,
type: 'input'
},
{
id: 2,
type: 'boolean'
},
{
id: 3,
type: 'choice'
},
{
id: 1,
type: 'select'
},
]
arr.sort((a, b) => order.indexOf(a.type) - order.indexOf(b.type));
console.log(arr)
答案 1 :(得分:1)
如果有
const arr = [
{
id: 1,
type: 'input',
val: 1
},
{
id: 2,
type: 'boolean',
val: 3
},
{
id: 3,
type: 'choice',
val: 4,
},
{
id: 1,
type: 'select',
val: 2
},
]
那么这很容易:只需arr.sort((a, b) => a.val - b.val)
由于您没有属性val
,因此可以在之前将其设置为:
const typeToValue = {
input: 1,
boolean: 3,
choice: 4,
select: 2
}
arr.forEach(el => {
el.val = typeToValue[el.type]
})
arr.sort((a, b) => a.val - b.val)
也许您不想弄脏您的元素,请注意el.val == typeToValue[el.type]
意思是你可以写
arr.sort((a, b)=>typeToValue[a.type] - typeToValue[b.type])
最后,如果您有一个已排序的数组['input', 'select', 'boolean', 'choice']
,则可以通过typeToValue
将其简单地转换为Array.prototype.reduce
对象
const orders = ['input', 'select', 'boolean', 'choice']
const typeToValue = orders.reduce((o, el, i) => (o[el] = i, o), {})
或者如果您不喜欢使用Object.fromEntries
const typeToValue = Object.fromEntries(orders.map((el, i) => [el, i]))
const arr = [{"id":1,"type":"input"},{"id":2,"type":"boolean"},{"id":3,"type":"choice"},{"id":1,"type":"select"}]
const orders = ['input', 'select', 'boolean', 'choice']
const typeToValue1 = orders.reduce((o, el, i) => (o[el] = i, o), {})
const typeToValue2 = Object.fromEntries(orders.map((el, i) => [el, i]))
// just slice to copy array because sort modify in place
console.log(arr.slice(0).sort((a, b)=>typeToValue1[a.type] - typeToValue1[b.type]))
console.log(arr.slice(0).sort((a, b)=>typeToValue2[a.type] - typeToValue2[b.type]))