javascript 按首字母对字符串数组分组

mznpcxlj  于 2022-11-20  发布在  Java
关注(0)|答案(6)|浏览(228)

我 面临 的 挑战 是 :

  • 编写 一 个 将 字符 串 数组 作为 参数 的 函数
  • 然后 , 按 字符 串 的 首 字母 对 数组 中 的 字符 串 进行 分组
  • 返回 一 个 对象 , 该 对象 包含 具有 表示 首 字母 的 键 的 属性

例如 :
应 返回

groupIt(['hola', 'adios', 'chao', 'hemos', 'accion'])

// Should return
{ 
 a: [ "adios", "accion" ]
 c: [ "chao" ]
 h: [ "hola", "hemos" ]
​}

中 的 每 一 个
这 是 我 的 回答 , 它 返回 了 预期 的 对象 , 但 没有 通过 页面 中 的 测试 :

function groupIt(arr) {
  let groups = {}
  
  let firstChar = arr.map(el=>el[0])
  let firstCharFilter = firstChar.filter((el,id)=>{
    return firstChar.indexOf(el)===id
  })
 
  firstCharFilter.forEach(el=>{
    groups[el]=[]
  })
  
  firstCharFilter.forEach(char=>{
    for(let word of arr) {
      if(word[0]==char) {
        groups[char].push(word)
      }
    }
  })
    
  return groups
}

const result = groupIt(['hola', 'adios', 'chao', 'hemos', 'accion']);

console.log(result);

格式
我 在 哪里 失败 了 ?
这里 测试 一下 :https://www.jschallenger.com/javascript-arrays/javascript-group-array-strings-first-letter 的 最 大 值

nwo49xxi

nwo49xxi1#

该 网站 不 喜欢 .reduce , 但 这里 有 一 个 方法 :

const r1 = groupIt(['hola', 'adios', 'chao', 'hemos', 'accion'])
console.log(r1)

// Should return
// {
//   a: ["adios", "accion"]
//   c: ["chao"]
//   h: ["hola", "hemos"]
// }

function groupIt(arr) {
  return arr.reduce((store, word) => {
    const letter = word.charAt(0)
    const keyStore = (
      store[letter] ||     // Does it exist in the object?
      (store[letter] = []) // If not, create it as an empty array
    ); 
    keyStore.push(word)

    return store
  }, {})
}

中 的 每 一 个

wfypjpf4

wfypjpf42#

我运行了你的代码以及JS challenger提供的测试示例。我注意到它们是区分大小写的。所以虽然你的代码运行良好,但如果单词以大写字母开始,它将无法通过某些情况。附件是我的版本,通过了所有测试示例。
如果添加:. to LowerCase到firstChar,我相信你也会通过的。)
如果下面的图片不工作,请让我知道,我只是学习如何有助于堆栈交换,谢谢。

const groupIt = (array) => {
  let resultObj = {};
  
  for (let i =0; i < array.length; i++) {
    let currentWord = array[i];
    let firstChar = currentWord[0].toLowerCase();
    let innerArr = [];
    if (resultObj[firstChar] === undefined) {
       innerArr.push(currentWord);
      resultObj[firstChar] = innerArr
    }else {
      resultObj[firstChar].push(currentWord)
    }
  }
  return resultObj
}

console.log(groupIt(['hola', 'adios', 'chao', 'hemos', 'accion']))

console.log(groupIt(['Alf', 'Alice', 'Ben'])) // { a: ['Alf', 'Alice'], b: ['Ben']}

console.log(groupIt(['Ant', 'Bear', 'Bird'])) // { a: ['Ant'], b: ['Bear', 'Bird']}
console.log(groupIt(['Berlin', 'Paris', 'Prague'])) // { b: ['Berlin'], p: ['Paris', 'Prague']}
j5fpnvbx

j5fpnvbx3#

原因是区分大小写。请在charAt(0)之后放入toLowerCase。
下面是我的例子:
https://stackblitz.com/edit/node-tebpdp?file=ArrayStringsFirstLetter.js
Link to screenshot!

oipij1gg

oipij1gg4#

你的代码是正确的,唯一错误的部分是你没有小写第一个字母,下面是你的代码与额外的小写第一个字母,所以它通过了测试:

function groupIt(arr) {
  let groups = {}
  
  let firstChar = arr.map(el=>el[0])
  let firstCharFilter = firstChar.filter((el,id)=>{
    return firstChar.indexOf(el)===id
  })
 
  firstCharFilter.forEach(el=>{
    groups[el.toLowerCase()]=[]
  })
  
  firstCharFilter.forEach(char=>{
    for(let word of arr) {
      if(word[0]==char) {
        groups[char.toLowerCase()].push(word)
      }
    }
  })
    
  return groups;
}
nukf8bse

nukf8bse5#

const groupIt = (arr) => {
  
  return arr.reduce((acc, cur) => {
    const firstLetter = cur[0].toLowerCase();
    return { ...acc, [firstLetter]: [...(acc[firstLetter] || []), cur] };
  }, {});
};
dojqjjoe

dojqjjoe6#

function groupIt(arr) {
  var obj = {};
  arr.forEach(e => obj[e[0].toLowerCase()] = arr.filter(ele => ele[0].toLowerCase() == e[0].toLowerCase()));
  return obj;
}
console.log(groupIt(['Alf', 'Alice', 'Ben'])); //{ a: [ 'Alf', 'Alice' ], b: [ 'Ben' ] }
console.log(groupIt(['Ant', 'Bear', 'Bird'])); // { a: [ 'Ant' ], b: [ 'Bear', 'Bird' ] }
console.log(groupIt(['Berlin', 'Paris', 'Prague'])); // { b: [ 'Berlin' ], p: [ 'Paris', 'Prague' ] }

相关问题