簡體   English   中英

創建一個 function 以按 Javascript 中的值對對象數組進行排序

[英]Create a function to sort an array of objects by their values in Javascript

這是一個對象數組:

const movies = [
  {
    title: "Terminator",
    genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" },
  },
  {
    title: "Die Hard",
    genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" },
  },
  {
    title: "Get Out",
    genre: { _id: "5b21ca3eeb7f6fbccd471820", name: "Thriller" },
  },
]

我想按titlegenre.name名稱對它們進行排序。

我想創建 2 個新的 arrays,一個按title排序,另一個按genre.name排序。

到目前為止,我嘗試了這個,但顯然是錯誤的:

 const sortMovies = (item) => {
  movies.sort((a, b) =>
   a.item> b.item? 1 : b.item> a.item? -1 : 0
   );
 };

const sortTitle = sortMovies(title);
const sortGenre = sortMovies(genre.name);

請幫我找到解決方案。 對此,我真的非常感激!

似乎您想比較title然后genre.name

所以你可以用這種方式組合這些標准

a.title.localeCompare(b.title) || a.genre.name.localeCompare(b.genre.name)

 const movies = [ { title: "Terminator", genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" }, }, { title: "Die Hard", genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" }, }, { title: "Get Out", genre: { _id: "5b21ca3eeb7f6fbccd471820", name: "B" }, }, { title: "Get Out", genre: { _id: "5b21ca3eeb7f6fbccd471820", name: "A" }, }, ]; const sortMovies = (data) => { data.sort((a, b) => a.title.localeCompare(b.title)|| a.genre.name.localeCompare(b.genre.name)); } sortMovies(movies); console.log(movies);

如您所見, title = Get Out也是按genre.name排序的


已編輯

我想創建2個新的arrays,一個按標題排序,另一個按genre.name排序。

如果您想創建通用方法

  const sortMovies = (data, getValueByProp) => {
  data.sort((a, b) => 
  {
    const v1 = getValueByProp(a);
    const v2 = getValueByProp(b);
    return v1.localeCompare(v2);
  });
}
sortMovies(movies, (item) => item.title);
sortMovies(movies, (item) => item.genre.name);

 const movies = [ { title: "Terminator", genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" }, }, { title: "Die Hard", genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" }, }, { title: "Get Out", genre: { _id: "5b21ca3eeb7f6fbccd471820", name: "B" }, }, { title: "Get Out", genre: { _id: "5b21ca3eeb7f6fbccd471820", name: "A" }, }, ]; const sortMovies = (data, getValueByProp) => { data.sort((a, b) => { const v1 = getValueByProp(a); const v2 = getValueByProp(b); return v1.localeCompare(v2); }); } sortMovies(movies, (item) => item.title); console.log(movies); sortMovies(movies, (item) => item.genre.name); console.log(movies);

像這樣改變它

const sortMovies = (item) => {
       return movies.sort((a, b) =>
          a[item]> b[item]? 1 : b[item]> a[item]? -1 : 0
        );
      };
    
const sortTitle = sortMovies("title");

對於更多嵌套:由於性能問題,我不建議這樣做。 只是為了展示可能性

function getPropByString(obj, propString) {
    if (!propString)
        return obj;

    var prop, props = propString.split('.');

    for (var i = 0, iLen = props.length - 1; i < iLen; i++) {
        prop = props[i];

        var candidate = obj[prop];
        if (candidate !== undefined) {
            obj = candidate;
        } else {
            break;
        }
    }
    return obj[props[i]];
}
const sortMovies = (item) => {
    return movies.sort((a, b) =>
      getPropByString(a,item) > getPropByString(b,item)? 1 : getPropByString(b,item) > getPropByString(a,item) ? -1 : 0
    );
  };

  const sortTitle = sortMovies("title");
  const sortGenre = sortMovies("genre.name");

以下代碼段可能會對您有所幫助

 const movies = [ { title: "Terminator", genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" }, }, { title: "Die Hard", genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" }, }, { title: "Get Out", genre: { _id: "5b21ca3eeb7f6fbccd471820", name: "Thriller" }, }, ]; //sort by title var sortedByTitle = movies.sort( (a, b) => { if(a.title < b.title) { return -1; } if(a.title > b.title) { return 1; } return 0; } ); console.log(sortedByTitle); //sort by genre var sortedGenre = movies.sort( (a, b) => { if(a.genre.name < b.genre.name) { return -1; } if(a.genre.name > b.genre.name) { return 1; } return 0; } ); console.log(sortedGenre);

排序更高的順序 function 只需要1/-1所以傳遞0不應該據我所知.. 但是如果你想將項目排序為sortMovies function 參數提供的item ,你必須執行以下操作:

 const movies = [ { title: "Terminator", genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" }, }, { title: "Die Hard", genre: { _id: "5b21ca3eeb7f6fbccd471818", name: "Action" }, }, { title: "Get Out", genre: { _id: "5b21ca3eeb7f6fbccd471820", name: "Thriller" }, }, ] let sortsMovies = (properties) => { return movies.sort((a, b) => { try { const propertyArr = properties.split("."); // this gets properties from the end of the object nest const props1 = propertyArr.reduce((obj, prop) => obj[prop], a); const props2 = propertyArr.reduce((obj, prop) => obj[prop], b); return props1 > props2? 1: -1; } catch (error) { console.error('error:', error) } }); } const genre = sortsMovies("genre.name") const title = sortsMovies("title") console.log('title:', title) console.log('genre:', genre)

這應該使用提供的屬性對 Object 的數組進行排序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM