【问题标题】:Return an array with element in specific position返回具有特定位置元素的数组
【发布时间】:2018-03-31 21:41:25
【问题描述】:

我一直在努力解决这个问题,但我无法解决。 此函数接收一个名称数组,并应返回一个包含中间名的数组。如果某人没有中间名,则数组应在此索引处包含值 null。

我知道我的代码不完整,但无法完成一半。 splice 方法不管我做什么都不管用,现在我很迷茫。

这是我目前的代码:

function getMiddleNames (names) {
let solution =[];
let separated = [];
for(let i=0; i<names.length; i++){
  separated.push(names[i].split(' '));
} 
 return separated.splice(1);
}

还有测试:

describe('getMiddleNames', function () {
  it('returns [] when passed []', function () {
    expect(getMiddleNames([])).to.eql([]);
  });
  it('returns ["Hannah"] when passed ["Caroline Hannah Jamieson"]', function () {
    expect(getMiddleNames(['Caroline Hannah Jamieson'])).to.eql(['Hannah']);
  });
  it('returns ["Reuben", "Keith", "Clara"] when passed ["Steven Reuben Williams", "Carl Keith Morelli", "Sissel Clara Blomqvist"]', function () {
    expect(getMiddleNames(['Steven Reuben Williams', 'Carl Keith Morelli', 'Sissel Clara Blomqvist'])).to.eql(['Reuben', 'Keith', 'Clara']);
  });
  it('returns ["Reuben", null, "Clara"] when passed ["Steven Reuben Williams", "Carl Morelli", "Sissel Clara Blomqvist"]', function () {
    expect(getMiddleNames(['Steven Reuben Williams', 'Carl Morelli', 'Sissel Clara Blomqvist'])).to.eql(['Reuben', null, 'Clara']);
  });
  it('returns ["Reuben", null, null] when passed ["Steven Reuben Williams", "Carl Morelli", "Sissel"]', function () {
    expect(getMiddleNames(['Steven Reuben Williams', 'Carl Morelli', 'Sissel'])).to.eql(['Reuben', null, null]);
  });
});

谁能帮帮我?谢谢

【问题讨论】:

  • 提示:检查分割数组的长度

标签: javascript arrays methods


【解决方案1】:

您将整个名称推入您的分隔数组,然后将其拼接。这真的行不通。您需要将名称分开并单独拆分:

function getMiddleNames (names) {
    let solution =[];
    for(let i=0; i<names.length; i++){
    let separated = names[i].split(' ')
      solution.push(separated.length == 3 ? separated[1] : null);
    } 
     return solution
    }

let names = ['Steven Reuben Williams', 'Carl Morelli', 'Sissel Clara Blomqvist']

console.log(getMiddleNames(names))

这当然假设总会有一个中间名。如果没有它,它将失败并传递姓氏。

您可以更简洁地使用map 并同时测试名称长度。仍然会有边缘情况(有四个名字的人等):

let names = ['Steven Reuben Williams', 'Carl Keith Morelli', 'Sissel Clara Blomqvist']

let middles= names.map(n => {
    s = n.split(' ')
    // s should be an array [first, middle, last]
    // if no middle name it will be [first, last]  and length 2
    return s.length == 3 ? s[1] : null
})
console.log(middles)

【讨论】:

  • 它部分工作,因为返回此错误:AssertionError: 预期 [ [ 'Hannah' ] ] 深度等于 [ 'Hannah' ] + 预期 - 实际 [ - [ - "Hannah" - ] + "汉娜”]
  • @VisualXZ 对,那是因为slice 返回一个数组。我编辑只是返回值。地图版本应该处理空值。还编辑了第一个以检查没有中间名。
  • 我现在看到了,谢谢你的帮助。地图版本离我现在能做的还有点远,但我试着习惯了。干杯。
【解决方案2】:

试试这个:

function getMiddleNames(names) {
  return names.map(x => getMiddleNameOf(x));
}
function getMiddleNameOf(name) {
  let split = name.split(' ');
  return split.length == 3 ? split[1] : null;
}

【讨论】:

  • x 是一个字符串时,x.getMiddleName 来自哪里?答案似乎与问题中的代码没有任何关系
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 2017-03-22
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 2022-10-07
相关资源
最近更新 更多