在数组中的数组中按升序对名称进行排序

Sort names in ascending order in arrays in an array

例如,当给出一组名称时,

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(' ') 是否合适? 你会如何按升序对它们进行排序?

您可以使用 .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;
});

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

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

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