按字符串数组排序对象数组

时间:2019-03-14 12:43:58

标签: javascript arrays angularjs

所以我有一个类似于下面的对象数组:

var objs = [
  { key: 'address', value: '1234 street' },
  { key: 'nameAndTitle', value: 'John Smith, CEO' },
  { key: 'contactEmail', value: 'johnsmith@gmail.com' },
  { key: 'contactPhone', value: '1234567890' },
  { key: 'localPhone', value: '1234567890' },
  { key: 'status', value: 'open' },
]

我希望它与我拥有的另一个看起来像这样的字符串的顺序相同。

var keys = [
  'nameAndTitle',
  'contactPhone',
  'contactEmail',
  'address',
]

我想订购objs数组以匹配keys数组的顺序。如果keys数组中不存在该对象,则应将其放在底部。有人可以帮我吗?

4 个答案:

答案 0 :(得分:3)

您可以获取索引并按其增量进行排序。

var objs = [{ key: 'address', value: '1234 street' }, { key: 'nameAndTitle', value: 'John Smith, CEO' }, { key: 'contactEmail', value: 'johnsmith@gmail.com' }, { key: 'contactPhone', value: '1234567890' }],
    keys = ['nameAndTitle', 'contactPhone', 'contactEmail', 'address'];

objs.sort((a, b) => keys.indexOf(a.key) - keys.indexOf(b.key));

console.log(objs);
.as-console-wrapper { max-height: 100% !important; top: 0; }

要完全控制订单,您可以使用所需订单的值作为对象,并使用默认属性,该属性的值小于所有其他值,以将未知键排在最前面或大于所有其他值到数组的底部。

这种方法也适用于花式排序方案,如果需要,可以将未知项目排序到中间。

var objs = [{ key: 'localPhone', value: '1234567890' }, { key: 'status', value: 'open' }, { key: 'address', value: '1234 street' }, { key: 'nameAndTitle', value: 'John Smith, CEO' }, { key: 'contactEmail', value: 'johnsmith@gmail.com' }, { key: 'contactPhone', value: '1234567890' }],
    order = { nameAndTitle: 1, contactPhone: 2, contactEmail: 3, address: 4, default: Infinity };

objs.sort(({ key: a }, { key: b }) => (order[a] || order.default) - (order[b] || order.default));

console.log(objs);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES5

var objs = [{ key: 'localPhone', value: '1234567890' }, { key: 'status', value: 'open' }, { key: 'address', value: '1234 street' }, { key: 'nameAndTitle', value: 'John Smith, CEO' }, { key: 'contactEmail', value: 'johnsmith@gmail.com' }, { key: 'contactPhone', value: '1234567890' }],
    order = { nameAndTitle: 1, contactPhone: 2, contactEmail: 3, address: 4, default: Infinity };

objs.sort(function (a, b) {
   return (order[a.key] || order.default) - (order[b.key] || order.default);
});

console.log(objs);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

您可以创建一个新数组,以正确的顺序推送对象,不会修改原始数组

如果您不介意修改原始数组,则可以调用sort函数,该函数将检查keys数组中的键位置(我相信您会得到一些答案帮助您使用这些方法)

编辑 @Nina Scholz快速完成了^^

const objs = [{
    key: 'address',
    value: '1234 street'
  },
  {
    key: 'nameAndTitle',
    value: 'John Smith, CEO'
  },
  {
    key: 'contactEmail',
    value: 'johnsmith@gmail.com'
  },
  {
    key: 'contactPhone',
    value: '1234567890'
  },
];

const keys = [
  'nameAndTitle',
  'contactPhone',
  'contactEmail',
  'address',
];

const array = keys.reduce((tmp, x) => {
  const item = objs.find(y => y.key === x);

  if (item) {
    tmp.push(item);
  }

  return tmp;
}, []);

console.log(array);

答案 2 :(得分:0)

如果可以对数组进行突变,则可以按以下方式使用sort函数:

var objs = [{
    key: 'address',
    value: '1234 street'
  },
  {
    key: 'nameAndTitle',
    value: 'John Smith, CEO'
  },
  {
    key: 'contactEmail',
    value: 'johnsmith@gmail.com'
  },
  {
    key: 'contactPhone',
    value: '1234567890'
  }
]

var keys = [
  'nameAndTitle',
  'contactPhone',
  'contactEmail',
  'address',
]

objs.sort(function(a, b) {
  return keys.indexOf(a.key) - keys.indexOf(b.key);
});

console.log(objs)

答案 3 :(得分:0)

您可以执行以下操作:

循环遍历字符串数组。将值(nameAndTitle)与obj数组的相同索引的值进行比较。如果不匹配,请在obj数组的键标记中搜索该字符串,然后将其移至正确的索引。那就是我会怎么做