如何根据子字段的值对对象数组进行排序?

How to sort an array of object depending on value of a subfield?

我有一个对象数组,称为带有嵌套字段答案的帖子。我有不同的条件,具体取决于我需要对数组进行排序。

示例数组

let posts = [
  {
                        "_id": "610b806ec6386ffa276b6d1c",
                        "post": "CDat the difference between Equity and News channel?",
                        "answers": [
                            {
                                "_id": "613724604dd4b6f39b344b4c",
                                "type": "text",
                                
                            },
                            {
                                "_id": "6113c826a64da80fe48ab543",
                                "type": "video",
                                
                            },
                            {
                                "_id": "6113c740a64da80fe48ab534",
                                "type": "audio",
                                
                            },
                            {
                                "_id": "611135cf7497d70b6cc2c5e0",
                                "type": "video",
                               
                            }
                        ]
                    },
                    {
                        "_id": "611e14329ff0c343540ae10e",
                        "post": "How forex affects investment 6",
                        "answers": [
                            {
                                "_id": "61371b3a9bf14a39207fff8a",
                                "type": "video",
                                
                            },
                            {
                                "_id": "613719369507fd12f93e3c62",
                                "type": "text",
                                
                            },
                            {
                                "_id": "6135f28e29aeae3de45fc8c2",
                                "type": "text",
                                
                            },
                            {
                                "_id": "6135f07c831da33c28fc1cf6",
                                "type": "audio",
                                
                            },
                            {
                                "_id": "6135eb2d51a8830698d65cf3",
                                "type": "text",
                               
                            },
                           
                        ]
                    }

]

我需要做的是...我想对所有类型为“视频”的答案进行排序,然后输入“音频”,然后像这样输入“文本”答案


let posts = [
  {
                        "_id": "610b806ec6386ffa276b6d1c",
                        "post": "CDat the difference between Equity and News channel?",
                        "answers": [
                            {
                                "_id": "613724604dd4b6f39b344b4c",
                                "type": "video",
                                
                            },
                            {
                                "_id": "6113c826a64da80fe48ab543",
                                "type": "video",
                                
                            },
                            {
                                "_id": "6113c740a64da80fe48ab534",
                                "type": "audio",
                                
                            },
                            {
                                "_id": "611135cf7497d70b6cc2c5e0",
                                "type": "text",
                               
                            }
                        ]
                    },
                    {
                        "_id": "611e14329ff0c343540ae10e",
                        "post": "How forex affects investment 6",
                        "answers": [
                            {
                                "_id": "61371b3a9bf14a39207fff8a",
                                "type": "video",
                                
                            },
                            {
                                "_id": "613719369507fd12f93e3c62",
                                "type": "audio",
                                
                            },
                            {
                                "_id": "6135f28e29aeae3de45fc8c2",
                                "type": "text",
                                
                            },
                            {
                                "_id": "6135f07c831da33c28fc1cf6",
                                "type": "text",
                                
                            },
                            {
                                "_id": "6135eb2d51a8830698d65cf3",
                                "type": "text",
                               
                            },
                           
                        ]
                    }

]

如有任何帮助,我们将不胜感激。谢谢

你应该为此使用 lodash。查看 _.orderBy() 方法。这是一个有用的 link:https://www.geeksforgeeks.org/lodash-_-orderby-method/

您需要添加自定义比较功能。

这是针对您的问题的最简单的解决方案

let posts = [
  {
                        "_id": "610b806ec6386ffa276b6d1c",
                        "post": "CDat the difference between Equity and News channel?",
                        "answers": [
                            {
                                "_id": "613724604dd4b6f39b344b4c",
                                "type": "text",
                                
                            },
                            {
                                "_id": "6113c826a64da80fe48ab543",
                                "type": "video",
                                
                            },
                            {
                                "_id": "6113c740a64da80fe48ab534",
                                "type": "audio",
                                
                            },
                            {
                                "_id": "611135cf7497d70b6cc2c5e0",
                                "type": "video",
                               
                            }
                        ]
                    },
                    {
                        "_id": "611e14329ff0c343540ae10e",
                        "post": "How forex affects investment 6",
                        "answers": [
                            {
                                "_id": "61371b3a9bf14a39207fff8a",
                                "type": "video",
                                
                            },
                            {
                                "_id": "613719369507fd12f93e3c62",
                                "type": "text",
                                
                            },
                            {
                                "_id": "6135f28e29aeae3de45fc8c2",
                                "type": "text",
                                
                            },
                            {
                                "_id": "6135f07c831da33c28fc1cf6",
                                "type": "audio",
                                
                            },
                            {
                                "_id": "6135eb2d51a8830698d65cf3",
                                "type": "text",
                               
                            },
                           
                        ]
                    }

]


function type (t){
   if(t==="video") return 1;
   if(t==="audio") return 2;
   if(t==="text")return 3;
}
function comparotor(a, b){
  

  return type(a.type) - type(b.type)
}

posts.map(ele=>{
  ele.answers.sort(comparotor);
})

console.log(posts);

您需要遍历 posts 数组中的每个条目,并使用自定义函数对每个条目中的 answers 数组进行排序。

自定义函数 (ele1, ele2) => {} 的 return 值应该 return 一个值 > 0 如果 ele1 应该放在 ele2 之后,一个值 <如果 ele1 应该放在 ele2 之前,则为 0,如果认为它们相等,则值为 0。

const getRanking = (ele) => {
    if (ele.type == "video") return 1; 
    if (ele.type == "audio") return 2;
    if (ele.type == "text") return 3;
};

posts = posts.map(post => {
    post.answers.sort((ele1, ele2) => {
        return getRanking(ele1) - getRanking(ele2);
    });
    return post;
}); 

只需要将比较器函数传递给sort函数就可以使用JS轻松实现结果

"video" => "v"
"audio" => "a"
"text"  => "t"

您可以使用 indexOf 检查已排序字母列表中的第一个字母(vat)

posts.map((o) =>o.answers.sort((a, b) => "vat".indexOf(a.type[0]) - "vat".indexOf(b.type[0])))

let posts = [
  {
    _id: "610b806ec6386ffa276b6d1c",
    post: "CDat the difference between Equity and News channel?",
    answers: [
      {
        _id: "613724604dd4b6f39b344b4c",
        type: "text",
      },
      {
        _id: "6113c826a64da80fe48ab543",
        type: "video",
      },
      {
        _id: "6113c740a64da80fe48ab534",
        type: "audio",
      },
      {
        _id: "611135cf7497d70b6cc2c5e0",
        type: "video",
      },
    ],
  },
  {
    _id: "611e14329ff0c343540ae10e",
    post: "How forex affects investment 6",
    answers: [
      {
        _id: "61371b3a9bf14a39207fff8a",
        type: "video",
      },
      {
        _id: "613719369507fd12f93e3c62",
        type: "text",
      },
      {
        _id: "6135f28e29aeae3de45fc8c2",
        type: "text",
      },
      {
        _id: "6135f07c831da33c28fc1cf6",
        type: "audio",
      },
      {
        _id: "6135eb2d51a8830698d65cf3",
        type: "text",
      },
    ],
  },
];

const result = posts.map((o) =>o.answers.sort((a, b) => "vat".indexOf(a.type[0]) - "vat".indexOf(b.type[0])));
console.log(result);