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

按与第二个数组中的字符串相同的对象属性值对数组进行排序

  •  1
  • Stuart  · 技术社区  · 6 年前

    对不起,我真的不知道该怎么说。我被卡住了,我需要按对象的标题属性值对数组进行排序,排序顺序与第二个字符串数组的顺序相同。

    基本上,我有两个数组…

    var titles = [
      'title1',
      'title2',
      'title3',
      'title4',
      'title5'
    ]
    
    var objects = [
      {
        title: 'title5',
        ...//other values
      }, {
        title: 'title3',
        ...//other values
      }
      , {
        title: 'title4',
        ...//other values
      }, {
        title: 'title1',
        ...//other values
      }, {
        title: 'title2',
        ...//other values
      } 
    ]
    

    我想点菜 objects 数组的顺序与中的字符串的顺序相同 titles 数组。这有可能吗?我的代码库可以访问下划线,或者我可以使用纯ES6。

    6 回复  |  直到 6 年前
        1
  •  2
  •   Nenad Vracar    6 年前

    您可以从标题数组创建对象,并使用它来排序对象数组。

    var objects = [{"title":"title5"},{"title":"title3"},{"title":"title4"},{"title":"title1"},{"title":"title2"}]
    var titles = ['title1','title2','title3','title4','title5'].reduce((r, e, i) => Object.assign(r, {[e]: i}), {})
    
    objects.sort((a, b) => titles[a.title] - titles[b.title])
    console.log(objects)
        2
  •  1
  •   TKoL    6 年前

    是的,这是很有可能的。我个人会遵循“装饰-分类-未装饰”的模式:

    var titles = [
      'title1',
      'title2',
      'title3',
      'title4',
      'title5'
    ]
    
    var objects = [
      {
        title: 'title5',
        //other values
      }, {
        title: 'title3',
        //other values
      }
      , {
        title: 'title4',
        //other values
      }, {
        title: 'title1',
        //other values
      }, {
        title: 'title2',
        //other values
      } 
    ]
    
    var rankings = objects.map( o => ({
        object: o,
        ranking: titles.indexOf(o.title)
    }))
    
    rankings.sort((a, b) => a.ranking-b.ranking)
    
    var sortedObjects = rankings.map(r => r.object);
    
    console.log(sortedObjects);
    
        3
  •  0
  •   Treble Snake    6 年前

    你可以使用 _.indexBy 创建一个 Object objects 变量,然后映射 titles :

    const objectsByTitle = _.indexBy(objects, 'title');
    const result = titles.map(it => objectsByTitle[it]);
    

    标题应该是唯一的OFC。

        4
  •  -1
  •   Marcelo Macedo    6 年前

    你能检查一下这是否能解决你所需要的问题吗?

    var titles = [
      'title1',
      'title2',
      'title3',
      'title4',
      'title5'
    ]
    
    var objects = [
      {
        title: 'title5',
      }, {
        title: 'title3',
      }
      , {
        title: 'title4',
      }, {
        title: 'title1',
      }, {
        title: 'title2',
      } 
    ]
    
    function compare(a,b) {
      if (a.title < b.title)
        return -1;
      if (a.title > b.title)
        return 1;
      return 0;
    }
    
    console.log(objects.sort(compare));
    

    https://jsfiddle.net/sxtn57gj/

        5
  •  -1
  •   Code Maniac    6 年前

    你可以使用 map find

    找到 我们匹配从对象中找到匹配的标题元素,并使用 地图

    var titles = ['title1','title2','title3','title4','title5']
    
    var objects = [{title: 'title5',}, { title: 'title3',},{title: 'title4',}, {title: 'title1',}, {title: 'title2',} ]
    
    let op = titles.map(e=> objects.find(({title})=> title === e))
    
    console.log(op)
        6
  •  -1
  •   Ulysse BN    6 年前

    有一个简单(但昂贵)的解决方案:

    let titles = ['foo', 'bar', 'fizz', 'buzz']
    
    let objects = [{title: 'fizz'}, {title: 'bar'}, {title: 'buzz'}, {title: 'foo'}]
    
    console.log(titles.map(title => objects.find(o => o.title === title)))

    然而 这是O(n) 解决方案,我很确定您的需求可能有点不同,您可以使用一个对象, title 作为钥匙。