【问题标题】:Sort names in ascending order in arrays in an array在数组中按升序对数组中的名称进行排序
【发布时间】:2020-11-23 18:35:14
【问题描述】:

例如,当给定一个名称数组时,

let names = [
  [
    ['firstName', 'Rachel'],
    ['age', 10],
    ['gender', 'female'],
  ],
  [
    ['firstName', 'Sam'],
    ['lastName', 'Smith'],
    ['age', 20],
    ['gender', 'male'],
  ],
];

输出应类似于以下代码。

let output = nameInOrder(names);
console.log(output); // --> ['Rachel', 'Sam Smith'];

为了让我完成nameInOrder的功能,

function nameInOrder(arr) {
// my code goes here
}

我是否可以从 .map 开始将表单更改为数组中的对象 sort(a,b).map.join(' ') ? 你会如何按升序对它们进行排序?

【问题讨论】:

  • 为什么不使用对象而不是数组来指定一个人?
  • 您需要将带有.map 的数据转换为字符串,然后对其进行排序

标签: javascript arrays object higher-order-functions


【解决方案1】:

.map 方向正确。您需要将数据转换为字符串,然后对它们进行排序。

let people = [
  [
    ['firstName', 'Rachel'],
    ['age', 10],
    ['gender', 'female'],
  ],
  [
    ['firstName', 'Sam'],
    ['lastName', 'Smith'],
    ['age', 20],
    ['gender', 'male'],
  ],
];

function nameInOrder(arr) {
  return arr.map(person => {
    const fields = person.map(entry => entry[0])
    if (fields.includes('firstName') && fields.includes('lastName')) {
      return [
        person.find(entry => entry[0] == 'firstName')[1],
        person.find(entry => entry[0] == 'lastName')[1],
      ].join(' ')
    } else if (fields.includes('firstName')) {
      return person.find(entry => entry[0] == 'firstName')[1]
    } else if (fields.includes('lastName')) {
      return person.find(entry => entry[1] == 'lastName')[1]
    } else {
      return ''
    }
  }).sort()
}

console.log(nameInOrder(people))

【讨论】:

  • 感谢您的回答。您愿意解释一下为什么我会看到此错误消息吗? ``` AssertionError: 预期 ['', 'Mary Jenkins', 'Samuel' ] 与 ['Samuel', 'Revees', 'Mary Jenkins' ] 完全相等```
  • 添加了一个人只有'lastName'的情况
  • 我是否应该添加另一个 else if 并放在 AssertionError: expected [ '', 'Mary Jenkins', 'Samuel' ] to deeply equal [ 'Samuel', 'Revees', 'Mary Jenkins' ] 下方? ``
  • 我更新了原始答案以处理 lastName 的情况(因为我已经在处理默认值,所以我想我也可以)。更新后的 sn-p 应该通过这些测试用例。
【解决方案2】:

您可以使用.sort()https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

定义一个函数来比较您传递给.sort() 的名称。

names.sort((a,b) => {
  var nameA = a[0][1].toUpperCase(); // ignore upper and lowercase
  var nameB = b[0][1].toUpperCase(); // ignore upper and lowercase
  if (nameA < nameB) {
    return -1;
  }
  if (nameA > nameB) {
    return 1;
  }

  // names must be equal
  return 0;
});

请考虑不要像这样格式化您的数据,请执行以下操作:

let names = [
  [
    { 'firstName': 'Rachel' },
    { 'age': 10 },
    { 'gender': 'female' }
  ]
];

在这种情况下,排序将类似,但不依赖于名称数组中属性的顺序。

names.sort((a,b) => {
  var nameA = a.firstName.toUpperCase(); // ignore upper and lowercase
  var nameB = b.firstName.toUpperCase(); // ignore upper and lowercase
  if (nameA < nameB) {
    return -1;
  }
  if (nameA > nameB) {
    return 1;
  }

  // names must be equal
  return 0;
});

【讨论】:

  • 数组名称是前缀的,我需要将其转换为数组中的对象...虽然谢谢你的回答
【解决方案3】:

如果源数据真的只能是数组。

const names = [
  [
    ['firstName', 'Rachel'],
    ['age', 10],
    ['gender', 'female'],
  ],
  [
    ['firstName', 'Sam'],
    ['lastName', 'Smith'],
    ['age', 20],
    ['gender', 'male'],
  ],
];

const result = names.map(person => {
    const name = person.reduce((obj, [index, value]) => {
        obj[index] = value;
        return obj;
      }, {});
    return `${name.firstName || ''} ${name.lastName || ''}`.trim();
});

console.log (result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2019-11-04
    • 2016-02-01
    相关资源
    最近更新 更多