代码之家  ›  专栏  ›  技术社区  ›  seriously

从已排序的数组中获取原始对象

  •  0
  • seriously  · 技术社区  · 2 年前

    我有一个带有嵌套对象的分块数组,我所做的是从对象中获取一个值,然后按升序对其进行排序,这样做效果很好。我想要的是,一旦我对数字进行排序,我想得到数字所在的对象,然后将其推送到一个新的数组中。我怎样才能做到这一点?提前谢谢。

    笔记 可能会有重复的总视图,所以不要只尝试将排序后的数组与对象值进行匹配,因为这会导致错误的排序顺序。

    const myArr = [{
        "title": "Hanging Out At Pokimanes House!",
        "totalViews": "1.5M views",
        "postedAgo": "1 day ago",
        "video_id": "XlZlKiT1uZM",
        "video_thumbnail": "http://img.youtube.com/vi/XlZlKiT1uZM/hqdefault.jpg"
      }, {
        "title": "JiDion Gets A Haircut At The Worlds Largest Tennis Match",
        "totalViews": "207K views",
        "postedAgo": "3 days ago",
        "video_id": "Q5twKgxO8xg",
        "video_thumbnail": "http://img.youtube.com/vi/Q5twKgxO8xg/hqdefault.jpg"
      }, {
        "title": "JiDion Gives Away $10,000",
        "totalViews": "1M views",
        "postedAgo": "7 days ago",
        "video_id": "XdNoAcONMB4",
        "video_thumbnail": "http://img.youtube.com/vi/XdNoAcONMB4/hqdefault.jpg"
      }, {
        "title": "JiDion Simping For Valkyrae For 13 Minutes & 10 Seconds",
        "totalViews": "231K views",
        "postedAgo": "8 days ago",
        "video_id": "H-vqkCkBaOs",
        "video_thumbnail": "http://img.youtube.com/vi/H-vqkCkBaOs/hqdefault.jpg"
      }, {
        "title": "KSI Wants JiDion To Start Boxing?!",
        "totalViews": "384K views",
        "postedAgo": "9 days ago",
        "video_id": "XyCHANsiJrc",
        "video_thumbnail": "http://img.youtube.com/vi/XyCHANsiJrc/hqdefault.jpg"
      },{
        "title": "How Mr Beast Made JiDion Delete His Twitter!",
        "totalViews": "445K views",
        "postedAgo": "9 days ago",
        "video_id": "oyvjTFtTep0",
        "video_thumbnail": "http://img.youtube.com/vi/oyvjTFtTep0/hqdefault.jpg"
      }, {
        "title": "Try Not to Get Offended Challenge Ft. BlmDion",
        "totalViews": "195K views",
        "postedAgo": "10 days ago",
        "video_id": "F9XNkj5c_IU",
        "video_thumbnail": "http://img.youtube.com/vi/F9XNkj5c_IU/hqdefault.jpg"
      }, {
        "title": "This Video Might Get JiDion Cancelled",
        "totalViews": "309K views",
        "postedAgo": "10 days ago",
        "video_id": "ktLcFyTOhK0",
        "video_thumbnail": "http://img.youtube.com/vi/ktLcFyTOhK0/hqdefault.jpg"
      }, {
        "title": "Your Favorite YouTuber Doesn't Like You",
        "totalViews": "503K views",
        "postedAgo": "11 days ago",
        "video_id": "oAAmzJDvrEk",
        "video_thumbnail": "http://img.youtube.com/vi/oAAmzJDvrEk/hqdefault.jpg"
      }, {
        "title": "JiDion Gets IShowSpeed And Jake Lucky On The Phone Together! (BEEF SQUASHED??)",
        "totalViews": "225K views",
        "postedAgo": "12 days ago",
        "video_id": "0lfF8J2KwSs",
        "video_thumbnail": "http://img.youtube.com/vi/0lfF8J2KwSs/hqdefault.jpg"
      }
    ]
    
    function convert(number) {
      var base = parseFloat(number);
      if (number.toLowerCase().match(/k/)) {
        return Math.round(base * 1000);
      } else if (number.toLowerCase().match(/m/)) {
        return Math.round(base * 1000000);
      } else if (number.toLowerCase().match(/b/)) {
        return Math.round(base * 1000000000);
      }
    }
    
    let viewsTracker = []
    for (var i = 0; i < myArr.length; i++) {
       viewsTracker.push(convert(myArr[i].totalViews.replace(' views', '')))
    }
    
    viewsTracker.sort(function(a, b) {
      if (a === Infinity)
        return 1;
      else if (isNaN(a))
        return -1;
      else
        return a - b;
    });
    
    //here print myArr but by the sort order
    console.log(viewsTracker.reverse());
    2 回复  |  直到 2 年前
        1
  •  2
  •   GrafiCode    2 年前

    您可以直接对对象数组进行自定义排序,而不是处理 viewsTracker 大堆

    const myArr = [{
        "title": "Hanging Out At Pokimanes House!",
        "totalViews": "1.5M views",
        "postedAgo": "1 day ago",
        "video_id": "XlZlKiT1uZM",
        "video_thumbnail": "http://img.youtube.com/vi/XlZlKiT1uZM/hqdefault.jpg"
      }, {
        "title": "JiDion Gets A Haircut At The Worlds Largest Tennis Match",
        "totalViews": "207K views",
        "postedAgo": "3 days ago",
        "video_id": "Q5twKgxO8xg",
        "video_thumbnail": "http://img.youtube.com/vi/Q5twKgxO8xg/hqdefault.jpg"
      }, {
        "title": "JiDion Gives Away $10,000",
        "totalViews": "1M views",
        "postedAgo": "7 days ago",
        "video_id": "XdNoAcONMB4",
        "video_thumbnail": "http://img.youtube.com/vi/XdNoAcONMB4/hqdefault.jpg"
      }, {
        "title": "JiDion Simping For Valkyrae For 13 Minutes & 10 Seconds",
        "totalViews": "231K views",
        "postedAgo": "8 days ago",
        "video_id": "H-vqkCkBaOs",
        "video_thumbnail": "http://img.youtube.com/vi/H-vqkCkBaOs/hqdefault.jpg"
      }, {
        "title": "KSI Wants JiDion To Start Boxing?!",
        "totalViews": "384K views",
        "postedAgo": "9 days ago",
        "video_id": "XyCHANsiJrc",
        "video_thumbnail": "http://img.youtube.com/vi/XyCHANsiJrc/hqdefault.jpg"
      },{
        "title": "How Mr Beast Made JiDion Delete His Twitter!",
        "totalViews": "445K views",
        "postedAgo": "9 days ago",
        "video_id": "oyvjTFtTep0",
        "video_thumbnail": "http://img.youtube.com/vi/oyvjTFtTep0/hqdefault.jpg"
      }, {
        "title": "Try Not to Get Offended Challenge Ft. BlmDion",
        "totalViews": "195K views",
        "postedAgo": "10 days ago",
        "video_id": "F9XNkj5c_IU",
        "video_thumbnail": "http://img.youtube.com/vi/F9XNkj5c_IU/hqdefault.jpg"
      }, {
        "title": "This Video Might Get JiDion Cancelled",
        "totalViews": "309K views",
        "postedAgo": "10 days ago",
        "video_id": "ktLcFyTOhK0",
        "video_thumbnail": "http://img.youtube.com/vi/ktLcFyTOhK0/hqdefault.jpg"
      }, {
        "title": "Your Favorite YouTuber Doesn't Like You",
        "totalViews": "503K views",
        "postedAgo": "11 days ago",
        "video_id": "oAAmzJDvrEk",
        "video_thumbnail": "http://img.youtube.com/vi/oAAmzJDvrEk/hqdefault.jpg"
      }, {
        "title": "JiDion Gets IShowSpeed And Jake Lucky On The Phone Together! (BEEF SQUASHED??)",
        "totalViews": "225K views",
        "postedAgo": "12 days ago",
        "video_id": "0lfF8J2KwSs",
        "video_thumbnail": "http://img.youtube.com/vi/0lfF8J2KwSs/hqdefault.jpg"
      }
    ]
    
    
    // FIRST CONCAT ALL OBJECTS INTO A SINGLE ARRAY
    //const theArr = myArr.reduce((a, b) => a.concat(b))
    
    // IN THIS EXAMPLE, THERE IS NO NEED TO CONCAT ARRAYS, SINCE IT IS ALREADY FLAT
    const theArr = myArr
    
    function convert(number) {
      var base = parseFloat(number);
      if (number.toLowerCase().match(/k/)) {
        return Math.round(base * 1000);
      } else if (number.toLowerCase().match(/m/)) {
        return Math.round(base * 1000000);
      } else if (number.toLowerCase().match(/b/)) {
        return Math.round(base * 1000000000);
      }
    }
    
    
    
    function compare(a, b) {
      a.numTotalViews = convert(a.totalViews.replace(' views', ''))
      b.numTotalViews = convert(b.totalViews.replace(' views', ''))
    
      if (a.numTotalViews < b.numTotalViews) {
        return 1;
      }
      if (a.numTotalViews > b.numTotalViews) {
        return -1;
      }
      return 0;
    }
    
    theArr.sort(compare);
    
    console.log(theArr);
        2
  •  1
  •   Taha Azzabi    2 年前

    我建议将数组变平,此代码不会使原始数组发生突变

    const myArr = [
      [
        {
          title: "Hanging Out At Pokimanes House!",
          totalViews: "1.5M views",
          postedAgo: "1 day ago",
          video_id: "XlZlKiT1uZM",
          video_thumbnail: "http://img.youtube.com/vi/XlZlKiT1uZM/hqdefault.jpg",
        },
        {
          title: "JiDion Gets A Haircut At The Worlds Largest Tennis Match",
          totalViews: "207K views",
          postedAgo: "3 days ago",
          video_id: "Q5twKgxO8xg",
          video_thumbnail: "http://img.youtube.com/vi/Q5twKgxO8xg/hqdefault.jpg",
        },
        {
          title: "JiDion Gives Away $10,000",
          totalViews: "1M views",
          postedAgo: "7 days ago",
          video_id: "XdNoAcONMB4",
          video_thumbnail: "http://img.youtube.com/vi/XdNoAcONMB4/hqdefault.jpg",
        },
        {
          title: "JiDion Simping For Valkyrae For 13 Minutes & 10 Seconds",
          totalViews: "231K views",
          postedAgo: "8 days ago",
          video_id: "H-vqkCkBaOs",
          video_thumbnail: "http://img.youtube.com/vi/H-vqkCkBaOs/hqdefault.jpg",
        },
        {
          title: "KSI Wants JiDion To Start Boxing?!",
          totalViews: "384K views",
          postedAgo: "9 days ago",
          video_id: "XyCHANsiJrc",
          video_thumbnail: "http://img.youtube.com/vi/XyCHANsiJrc/hqdefault.jpg",
        },
      ],
      [
        {
          title: "How Mr Beast Made JiDion Delete His Twitter!",
          totalViews: "445K views",
          postedAgo: "9 days ago",
          video_id: "oyvjTFtTep0",
          video_thumbnail: "http://img.youtube.com/vi/oyvjTFtTep0/hqdefault.jpg",
        },
        {
          title: "Try Not to Get Offended Challenge Ft. BlmDion",
          totalViews: "195K views",
          postedAgo: "10 days ago",
          video_id: "F9XNkj5c_IU",
          video_thumbnail: "http://img.youtube.com/vi/F9XNkj5c_IU/hqdefault.jpg",
        },
        {
          title: "This Video Might Get JiDion Cancelled",
          totalViews: "309K views",
          postedAgo: "10 days ago",
          video_id: "ktLcFyTOhK0",
          video_thumbnail: "http://img.youtube.com/vi/ktLcFyTOhK0/hqdefault.jpg",
        },
        {
          title: "Your Favorite YouTuber Doesn't Like You",
          totalViews: "503K views",
          postedAgo: "11 days ago",
          video_id: "oAAmzJDvrEk",
          video_thumbnail: "http://img.youtube.com/vi/oAAmzJDvrEk/hqdefault.jpg",
        },
        {
          title:
            "JiDion Gets IShowSpeed And Jake Lucky On The Phone Together! (BEEF SQUASHED??)",
          totalViews: "225K views",
          postedAgo: "12 days ago",
          video_id: "0lfF8J2KwSs",
          video_thumbnail: "http://img.youtube.com/vi/0lfF8J2KwSs/hqdefault.jpg",
        },
      ],
    ];
    function convert(number) {
      var base = parseFloat(number);
      if (number.toLowerCase().match(/k/)) {
        return Math.round(base * 1000);
      } else if (number.toLowerCase().match(/m/)) {
        return Math.round(base * 1000000);
      } else if (number.toLowerCase().match(/b/)) {
        return Math.round(base * 1000000000);
      }
    }
    
    const convertTotalViewsToNumber = (data) => {
      return data.flat().map((item) => {
        return {
          ...item,
          totalViewsAsNumber: convert(item.totalViews),
        };
        
      });
    };
    
    const sortArrayByKey = (data, key) => {
      return data.sort((a, b) => {
        return b[key] - a[key];
      });
    };
    
    console.log(sortArrayByKey(convertTotalViewsToNumber(myArr),"totalViewsAsNumber"));