Преобразование массива объектов в один объект - PullRequest
0 голосов
/ 04 июня 2018

Это мой начальный массив:

[ 
   { 
    id: 1,
    name: 'pos',
    code: 'pos123',
    appCode: 22,
   },
  { 
    id: 2,
    name: 'tailor',
    code: 'tailor123',
    appCode: 21,
  } 
]

Мой желаемый вывод:

{
   pos123: {
    id: 1,
    name: 'pos',
    code: 'pos123',
    appCode: 22,
  },
  tailor123: {
    id: 2,
    name: 'tailor',
    code: 'tailor123',
    appCode: 21,
  },
}

Я пытался сделать это с map, но я не мог понять это.Должен ли я использовать reduce здесь?

Ответы [ 6 ]

0 голосов
/ 04 июня 2018

Кажется, что другие решения включают свойство code в результирующий объект.Этот не

const test = [ 
  { 
   id: 1,
   name: 'pos',
   code: 'pos123',
   appCode: 22,
  }, { 
   id: 2,
   name: 'tailor',
   code: 'tailor123',
   appCode: 21,
  } 
];
const test2 = JSON.parse(JSON.stringify(test));
const result = document.querySelector("#result");

result.textContent = "**No redundancy\n" + JSON.stringify(
  test.reduce( (newObj, el) => 
    (newObj[el.code] = delete el.code && el) && newObj, {} 
  ), null, " ");

// alternative
result.textContent += "\n\n**Alternative\n" + JSON.stringify(
  test2.reduce( (newObj, el) => (newObj[el.code] = el) && newObj, {}
  ), null, " ");
0 голосов
/ 04 июня 2018

Используя цикл, вы можете сделать это.

const resp = [
   {
    id: 1,
    name: 'pos',
    code: 'pos123',
    appCode: 22,
   },
  {
    id: 2,
    name: 'tailor',
    code: 'tailor123',
    appCode: 21,
  }
]

let res = {};

for (let i = 0; i < resp.length; i++) {
  res[resp[i]['code']] = {
    id: resp[i]['id'],
    name: resp[i]['name'],
    appCode: resp[i]['appCode'],
    code: resp[i]['code']
  }
}

console.log(res);
0 голосов
/ 04 июня 2018

Использовать функцию уменьшения массива

var data = [{
    id: 1,
    name: 'pos',
    code: 'pos123',
    appCode: 22,
  },
  {
    id: 2,
    name: 'tailor',
    code: 'tailor123',
    appCode: 21,
  }
]

var modData = data.reduce(function(acc, curr) {
  //acc is the empty array passed as argument
  // if empty array does not have a property pos123 or so 
  // create a key by this name
  if (!acc.hasOwnProperty(curr.code)) {
    // then add property to it
    acc[curr.code] = {
      id: curr.id,
      name: curr.name,
      appCode: curr.appCode
    }
  }

  return acc;

}, {})

console.log(modData)
0 голосов
/ 04 июня 2018

Ваш вывод не является массивом - это объект, поэтому вы должны использовать reduce.Вы можете использовать map только для преобразования X количества элементов в массиве в X количества элементов в другом массиве.

const input=[{id:1,name:'pos',code:'pos123',appCode:22,},{id:2,name:'tailor',code:'tailor123',appCode:21,}]
const output = input.reduce((a, obj) => {
  a[obj.code] = obj;
  return a;
}, {});
console.log(output);
0 голосов
/ 04 июня 2018
var yourArray = [ 
 { 
  id: 1,
  name: 'pos',
  code: 'pos123',
  appCode: 22,
  },
 {  
  id: 2,
  name: 'tailor',
  code: 'tailor123',
  appCode: 21,
 } 
];

//this is what you required
var output =  yourArray.reduce((obj, item) => {
  obj[code] =item;
  return obj;
}, {});
0 голосов
/ 04 июня 2018

Вы можете использовать Object.assign для сопоставления массива с ожидаемой формой ключей и значений.Попробуйте:

let array = [ 
   { 
    id: 1,
    name: 'pos',
    code: 'pos123',
    appCode: 22,
   },
  { 
    id: 2,
    name: 'tailor',
    code: 'tailor123',
    appCode: 21,
  } 
];

let output = Object.assign(...array.map(x => ({ [x.code]: x })));

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