Нажмите массив в объекте, если некоторые ключи одинаковы в JavaScript - PullRequest
0 голосов
/ 22 октября 2018

У меня есть такой код;

 var data = [
 {'times':'07:50','name':'bojes'},
 {'times':'07:50','name':'unknw1q2q'},
 {'times':'09:50','name':'rafik'},
 {'times':'11:50','name':'adit'},
 {'times':'15:50','name':'adit'},
 {'times':'15:50','name':'adrok'}
  ]; 

Я сгруппирую объект 'name' и перенесу его в новый массив, если 'times' совпадает.Я знаю, это как играть в array.reduce, найти где-нибудь в подчеркивании js или что-то в этом роде, но моя логика плохая.

И я буду рад, если вы выведете мой код следующим образом;

var newData = [
 {'times':'07:50','name': ['bojes','unknw1q2q'] },
 {'times':'09:50','name': ['rafik'] },
 {'times':'11:50','name': ['adit'] },
 {'times':'15:50','name': ['adit','adrok'] },
  ]; 

как я могу это сделать?некоторые люди хотят помочь мне?спасибо перед этим

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Вы можете сделать это эффективно, создав объект, привязанный к тому, что вы хотите, чтобы оно было уникальным - в данном случае times.Для каждого раза создайте объект с массивом для хранения ваших значений.В конце Object.values() объекта будет тем, что вы хотите.Это будет более эффективно, чем каждый раз искать в списке дубликаты:

var data = [{'times':'07:50','name':'bojes'},{'times':'07:50','name':'unknw1q2q'},{'times':'09:50','name':'rafik'},{'times':'11:50','name':'adit'},{'times':'15:50','name':'adit'},{'times':'15:50','name':'adrok'}];

let res = Object.values(data.reduce((obj, curr) => {
    // if we haven't seen the time before make a new entry
    if(!obj[curr.times]) obj[curr.times] = {times: curr.times, name: []}
    // push the current name into the current time entry
    obj[curr.times]['name'].push(curr.name)
    return obj
}, {}))
console.log(res)
0 голосов
/ 22 октября 2018

Вот один из способов, которым вы могли бы сделать это, используя Object.values ​​ и Array # lower :

const data = [
  {'times':'07:50','name':'bojes'},
  {'times':'07:50','name':'unknw1q2q'},
  {'times':'09:50','name':'rafik'},
  {'times':'11:50','name':'adit'},
  {'times':'15:50','name':'adit'},
  {'times':'15:50','name':'adrok'}
];

const groupByTimes = data => Object.values(data.reduce((data, {times, name}) => {
  if (data[times]) data[times].name.push(name);
  else data[times] = {times, name: [name]};
  return data;
}, {}));

console.log(groupByTimes(data));

В качестве альтернативы можно использовать Object.assign :

const data = [
  {'times':'07:50','name':'bojes'},
  {'times':'07:50','name':'unknw1q2q'},
  {'times':'09:50','name':'rafik'},
  {'times':'11:50','name':'adit'},
  {'times':'15:50','name':'adit'},
  {'times':'15:50','name':'adrok'}
];

const groupByTimes = data => Object.values(
  data.reduce((data, {times, name}) => Object.assign({}, data, {
    [times]: data[times]
      ? {times, name: [...data[times].name, name]}
      : {times, name: [name]}
  }), {})
);

console.log(groupByTimes(data));

Или с синтаксисом распространения объекта :

const data = [
  {'times':'07:50','name':'bojes'},
  {'times':'07:50','name':'unknw1q2q'},
  {'times':'09:50','name':'rafik'},
  {'times':'11:50','name':'adit'},
  {'times':'15:50','name':'adit'},
  {'times':'15:50','name':'adrok'}
];

const groupByTimes = data => Object.values(
  data.reduce((data, {times, name}) => ({
    ...data,
    [times]: data[times]
      ? {times, name: [...data[times].name, name]}
      : {times, name: [name]}
  }), {})
);

console.log(groupByTimes(data));
0 голосов
/ 22 октября 2018

Вы можете использовать reduce & findIndex. Используйте уменьшение, чтобы создать новый массив (также можно использовать карту).Используя findIndex получить индекс объекта из массива, где times совпадает.Если это так, то обновите массив имен, иначе создайте новый объект и вставьте массив аккумуляторов

var data = [{
    'times': '07:50',
    'name': 'bojes'
  },
  {
    'times': '07:50',
    'name': 'unknw1q2q'
  },
  {
    'times': '09:50',
    'name': 'rafik'
  },
  {
    'times': '11:50',
    'name': 'adit'
  },
  {
    'times': '15:50',
    'name': 'adit'
  },
  {
    'times': '15:50',
    'name': 'adrok'
  }
];

let k = data.reduce(function(acc, curr) {
  // check if the times is present

  let findIndex = acc.findIndex(function(item) {
    return item.times === curr.times
  })

  if (findIndex == -1) {
    let obj = Object.assign({}, {
      times: curr.times,
      name: [curr.name]
    })
    acc.push(obj)
  } else {
    acc[findIndex].name.push(curr.name)
  }

  return acc;
}, []);

console.log(k)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...