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

时间:2019-02-11 11:24:17

标签: javascript arrays

对不起,标题,我真的不知道该怎么写。我被困住了,我需要按照其对象的title属性值将数组排序为第二个字符串数组的顺序。

基本上,我有两个数组...

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数组进行排序。这可能吗?我的代码库可以访问_underscore,或者我可以使用普通的ES6。

6 个答案:

答案 0 :(得分:2)

您可以从titles数组创建对象,并将其用于排序对象数组。

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)

答案 1 :(得分:1)

是的,这很有可能。我个人将遵循“装饰-排序-取消装饰”模式:

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);

答案 2 :(得分:0)

您可以使用_.indexByObject变量中创建一个objects,然后映射titles

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

标题应该是唯一的。

答案 3 :(得分:-1)

有一个简单(但成本高昂)的解决方案:

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)))

但是这是ao(n²)解决方案,我很确定您的需求可能会有所不同,并且您可以使用title作为键来使用对象。

答案 4 :(得分:-1)

您能检查一下是否解决了您的需求吗?

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 :(得分:-2)

您可以使用mapfind

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

将其映射到新数组

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)