Создание свойства объекта js из ключей.

Привет я пытаюсь создать карту объектов из массива объектов, используя метод Reduce, но не нашел способ добавить 2 свойства в качестве ключа. Допустим, у меня есть массив объектов, таких как -

 const students = [
    {
      name: "sam",
      age: 26,
    },
    {
      name: 'john",
      age: 30,
    }
    ]

я пытаюсь создать карту как

{
  sam_26:{
      name: "sam",
      age: 26,
    }
 }

мой код для функции понижения:

students.reduce((obj, student) => {
    `${obj[student.name]}_${obj[student.age]}` = student;
    return obj;
  }, {});

это не сработало. любые указатели будут полезны.. спасибо!

4 ответа

Решение

Создайте ключ со значениями, взятыми из student объект. Назначить текущий student к obj (аккумулятор) с помощью key:

const students = [{
    name: "sam",
    age: 26,
  },
  {
    name: "john",
    age: 30,
  }
];

const result = students.reduce((obj, student) => {
  const key = `${student.name}_${student.age}`;
  obj[key] = student;
  return obj;
}, {});

console.log(result);

Общий подход, который использует обратный вызов для создания ключа:

const keyBy = (arr, cb) => 
  arr.reduce((r, o) => {
    const key = cb(o);
    r[key] = o;
    return r;
  }, {});
  
const students = [{"name":"sam","age":26},{"name":"john","age":30}];  

const result = keyBy(students, (o) => `${o.name}_${o.age}`);

console.log(result);

Вы не можете назначить левой стороне с литералом шаблона как это. Попробуйте сначала определить свойство, а затем назначить его объекту:

const students = [ { name: "sam", age: 26, }, { name: 'john', age: 30, } ];
const finalObj = students.reduce((obj, student) => {
  const prop = `${student.name}_${student.age}`;
  obj[prop] = student;
  return obj;
}, {});
console.log(finalObj);

Надеюсь, этот фрагмент будет полезен

const students = [{
    name: "sam",
    age: 26,
  },
  {
    name: "john",
    age: 30,
  }
]
//Using reduce function to add value to the accumalator
var x = students.reduce(function(acc, curr, index) {
  // Here acc is the object which is passed as argument,
  //In this object checking if it has a key like sam_26 & so on
  if (!acc.hasOwnProperty([curr['name'] + '_' + curr['age']])) {
    //if not then add the key and add relevant vakues to it
    acc[curr.name + '_' + curr.age] = {
      name: curr.name,
      age: curr.age
    }
  }
  return acc;
}, {});
console.log(x)

Я попробовал этот скрипт, и он работал. Просто создайте имя переменной на основе имени ученика и возраста, а затем присвойте объекту

students.reduce((obj, student) => {
    var name = student.name + '-' + student.age;
    obj[name] = student;
    return obj;
  }, {});
Другие вопросы по тегам