【问题标题】:How to re-order an array of objects based on several conditions?如何根据多个条件重新排序对象数组?
【发布时间】:2019-04-03 12:32:20
【问题描述】:

我正在尝试使用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);
});

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

【问题讨论】:

    标签: javascript arrays sorting javascript-objects


    【解决方案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;
    });

    【讨论】:

    • 谢谢,我不得不将1s 切换为-1s,反之亦然,但这似乎可以解决问题!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2021-02-01
    • 1970-01-01
    • 2022-07-25
    • 2018-11-01
    • 2021-10-26
    • 2012-02-11
    相关资源
    最近更新 更多