如何根据几种条件对对象数组重新排序?

时间:2019-04-03 12:32:21

标签: javascript arrays sorting javascript-objects

我正在尝试使用Array.prototype.sort()方法对数组或对象进行重新排序。

我的对象数组可能看起来像(我从现实生活场景中删除了不相关的属性):

[
    {
        context: [
            { value: 'hover' }
        ]
    },
    {
        context: []
    },
    {
        context: [
            { value: 'active' }
        ]
    },
    {
        context: [
            { value: 'large' }
        ]
    }
]

我需要根据context属性的嵌套对象中包含的值对对象重新排序。

条件是:

  • 如果没有上下文对象,请移至数组的开头
  • 如果上下文对象包含一个hover值,则移至数组的末尾

因此,上述4个对象的数组应从[1, 2, 3, 4][2, 3, 4, 1]

重新排序

我可以满足第一个条件,例如:

rules.sort((a, b) => {
    return (a.context.length - b.context.length);
});

...这根据上下文对象的数量(因此满足第一个条件)对数组重新排序,但是我不知道如何满足第二个条件。

我能够确定ab数组是否包含一个具有hover值的上下文对象,这似乎是一个不错的开始,但是我不确定在哪里从这里去...

rules.sort((a, b) => {
    const AIsHover  = a.context.some(c => c.value === 'hover');
    const BIsHover  = b.context.some(c => c.value === 'hover');

    return (a.context.length - b.context.length);
});

任何帮助将不胜感激!谢谢

1 个答案:

答案 0 :(得分:1)

您只需区分案例即可实现:

rules.sort((a, b) => {
    if (!a.context.length && !b.context.length) {
      return 0;
    }
    if (a.context.length && !b.context.length) {
      return 1;
    }
    if (!a.context.length && b.context.length) {
      return -1;
    }
    if (a.context.some(c => c.value === 'hover') && b.context.some(c => c.value === 'hover')) {
      return 0;
    }
    if (a.context.some(c => c.value === 'hover')) {
      return 1;
    }
    if (b.context.some(c => c.value === 'hover')) {
      return -1;
    }
    return 0;
});