按属性首字母分组对象数组

时间:2019-01-23 13:15:19

标签: javascript

我对此有点挣扎,自从我用javascript编码...尝试将其转换为

已有一段时间了
items = {
 "data": [
  {
    "name" : "john"
  },
  {
    "name" : "james"
  },
  {
    "name" : "joe"
  },
  {
    "name" : "brian"
  },
  {
    "name" : "bojan"
  },
  {
    "name" : "billy"
  },
  {
    "name" : "dean"
  },
  {
    "name" : "darren"
  },
  {
  "name" : "doug"
  }
]
}

转换为这种格式

items = {
 "data": [
  {
    letter: "j"
    names : ["john", "james", "joe"]
  },
  {
    letter: "b"
    names : ["brian", "bojan", "billy"]
  },
  {
    letter: "j"
    names : ["dean", "darren", "doug"]
  },
  ]
}

我一直在尝试使用reduce来做到这一点,但是看起来却不多。...有没有更简单的方法来做到这一点?

3 个答案:

答案 0 :(得分:1)

您可以使用reduce创建一个以字母为键的对象,通过使用object entries遍历map可以从中推断出所需的对象数组。

const items = {"data":[{"name":"john"},{"name":"james"},{"name":"joe"},{"name":"brian"},{"name":"bojan"},{"name":"billy"},{"name":"dean"},{"name":"darren"},{"name":"doug"}]};

// `reduce` over the data to produce an object
// with letter keys, and array values where the names are added
const obj = items.data.reduce((acc, c) => {
  const letter = c.name[0];
  acc[letter] = (acc[letter] || []).concat(c.name);
  return acc;
}, {})

// `map` over the object entries to return an array of objects
items.data = Object.entries(obj).map(([letter, names]) => {
  return { letter, names }
}).sort((a, b) => a.letter > b.letter);

console.log(items);

答案 1 :(得分:1)

香草javascript实现:

const items = {
 "data": [
  {
    "name" : "john"
  },
  {
    "name" : "james"
  },
  {
    "name" : "joe"
  },
  {
    "name" : "brian"
  },
  {
    "name" : "bojan"
  },
  {
    "name" : "billy"
  },
  {
    "name" : "dean"
  },
  {
    "name" : "darren"
  },
  {
  "name" : "doug"
  }
]
}

const transformed = {
  data:[]
}

const findByLetter = (letter) => (element) => element.letter === letter; 



for(let i = 0; i < items.data.length; i++){

  const letter = items.data[i].name.split("")[0];
  const elIndex = transformed.data.findIndex(findByLetter(letter));
  if(elIndex > -1){

 transformed.data[elIndex].names.push(items.data[i].name);
  }else{
   
  transformed.data.push({
    letter,
    names: [items.data[i].name],
  });
  }
  
};

console.log(transformed);

答案 2 :(得分:0)

使用一个reduce()

const items = {"data":[{"name":"john"},{"name":"james"},{"name":"joe"},{"name":"brian"},{"name":"bojan"},{"name":"billy"},{"name":"dean"},{"name":"darren"},{"name":"doug"}]};

let res = items.data.reduce((acc, item) => {
    let l = item.name[0];
    if (acc.data.filter(e => e.letter == l)[0] === undefined) acc.data.push({'letter': l, names: [] });
    acc.data.filter(e => e.letter == l)[0].names.push(item.name);
    return acc;
}, {"data": []})

console.log(res)