Как создать и новый объект при использовании карты? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть вопрос о следующем, я должен создать list2 из list1, поэтому я применил решение 1, которое работало хорошо.Однако мне пришлось сделать это отдельной функцией для модульного тестирования.После его изменения я не смог сделать его похожим на решение 2. Если я печатаю возвращаемое значение, оно говорит неопределенное для 3 элементов массива.У кого-нибудь есть совет по этой проблеме?Я очень старался, но я до сих пор не могу решить это.

var list1 = [
  { firstName: 'Sofia', lastName: 'I.', country: 'Argentina', continent: 'Americas', age: 35, language: 'Java' },
  { firstName: 'Lukas', lastName: 'X.', country: 'Croatia', continent: 'Europe', age: 35, language: 'Python' },
  { firstName: 'Madison', lastName: 'U.', country: 'United States', continent: 'Americas', age: 32, language: 'Ruby' } 
];

var list2 = [
  { firstName: 'Sofia', lastName: 'I.', country: 'Argentina', continent: 'Americas', age: 35, language: 'Java',
    greeting: 'Hi Sofia, what do you like the most about Java?'
  },
  { firstName: 'Lukas', lastName: 'X.', country: 'Croatia', continent: 'Europe', age: 35, language: 'Python',
    greeting: 'Hi Lukas, what do you like the most about Python?'
  },
  { firstName: 'Madison', lastName: 'U.', country: 'United States', continent: 'Americas', age: 32, language: 'Ruby',
    greeting: 'Hi Madison, what do you like the most about Ruby?'
  } 
];

Раствор 1

let greetings1 = list1.map(person => {
  return Object.assign(
    { firstName: person.firstName },
    { lastName: person.lastName },
    { country: person.country },
    { continent: person.continent },
    { age: person.age },
    { language: person.language },
    {
      greeting: `Hi ${person.firstName}, what do you like the most about ${
        person.language
      }?`
    }
  );
});

Раствор 2

function greetDevelopers(list1) {
  const greetings = list1.map(person => {
    Object.assign(
      { firstName: person.firstName },
      { lastName: person.lastName },
      { country: person.country },
      { continent: person.continent },
      { age: person.age },
      { language: person.language },
      {
        greeting: `Hi ${person.firstName}, what do you like the most about ${
          person.language
        }?`
      }
    );
  });
  return greetings;
}

Ответы [ 5 ]

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

Вот функциональный подход:

const input = [{
    firstName: 'Sofia',
    lastName: 'I.',
    country: 'Argentina',
    continent: 'Americas',
    age: 35,
    language: 'Java'
  },
  {
    firstName: 'Lukas',
    lastName: 'X.',
    country: 'Croatia',
    continent: 'Europe',
    age: 35,
    language: 'Python'
  },
  {
    firstName: 'Madison',
    lastName: 'U.',
    country: 'United States',
    continent: 'Americas',
    age: 32,
    language: 'Ruby'
  }
]

// objOf :: String -> Any -> Object
const objOf = prop => x => ({ [prop]: x })

// concatObj :: Object -> Object -> Object
const concatObj = x => y => ({ ...x, ...y })

// pipe :: Array (a -> Any) -> a -> b
const pipe = xs => x => xs.reduce((x, f) => f (x), x)

// greeting :: { firstName::String, language::String } -> String
const greeting = ({
  firstName,
  language
}) => `Hi ${firstName}, what do you like the most about ${language}?`

// appendGreeting :: Object -> Object
const appendGreeting = o => pipe ([ 
  greeting, // (1) Generates the greeting
  objOf ('greeting'), // (2) Creates an object owning greeting property
  concatObj (o) // (3) Concats the input object with the "greeting" one
]) (o)

const output = input.map (appendGreeting)

console.log (output)
0 голосов
/ 16 октября 2018

Я предполагаю, что вы имеете дело со структурами данных и функциями, которые их изменяют, что означает Абстрактные типы данных , и это в основном синоним для классов .В javascript существует три основных способа работы с классами или объектами:

Вы также проводите модульное тестирование, вам необходимо четко разделить код приложения и код тестирования.В следующем коде я буду использовать прототипы для простоты.

// APPLICATION CODE
function Person(data) {
  Object.assign(this,data);
  };
  
Person.prototype.greet = function() {
  return `Hi ${this.firstName}, what do you like the most about ${this.language}`;
};

// TESTING DATA
var inputList = [
  { firstName: 'Sofia', lastName: 'I.', country: 'Argentina', continent: 'Americas', age: 35, language: 'Java' },
  { firstName: 'Lukas', lastName: 'X.', country: 'Croatia', continent: 'Europe', age: 35, language: 'Python' },
  { firstName: 'Madison', lastName: 'U.', country: 'United States', continent: 'Americas', age: 32, language: 'Ruby' } 
];

// TESTING CODE
const createAndGreet = (data) => {
  const p = new Person(data);
  data.greeting = p.greet(); 
  return data;
};

console.log(inputList.map(createAndGreet));
0 голосов
/ 16 октября 2018

Вы можете взять объект и добавить только новое свойство, взяв копию старых свойств.

let greetings1 = list1.map(person => Object.assign(
    {},
    person,
    { greeting: `Hi ${person.firstName}, what do you like the most about ${person.language}?`}
));

Решение 2 не возвращает значение, отличное от undefied, поскольку вы не возвращаетесозданный объект.

function greetDevelopers(list1) {
    const greetings = list1.map(person => {
        return Object.assign(
        //^^^^
            // ...
        );
   });
   return greetings;
}
0 голосов
/ 16 октября 2018

решение 2 не возвращает Object.assign, следовательно, undefined возвращается.В дальнейшем вы можете упростить свой код до следующего

var list1 = [
  { firstName: 'Sofia', lastName: 'I.', country: 'Argentina', continent: 'Americas', age: 35, language: 'Java' },
  { firstName: 'Lukas', lastName: 'X.', country: 'Croatia', continent: 'Europe', age: 35, language: 'Python' },
  { firstName: 'Madison', lastName: 'U.', country: 'United States', continent: 'Americas', age: 32, language: 'Ruby' } 
];

function greetDevelopers(list1) {
  return list1.map(o => ({...o, greeting: `Hi ${o.firstName}, what do you like the most about ${o.language}?`}));
}
console.log(greetDevelopers(list1));
0 голосов
/ 16 октября 2018
function greetDevelopers(list1) {
  const greetings = list1.map(person => {
    return Object.assign( // add return before Object.assign
      { firstName: person.firstName },
      { lastName: person.lastName },
      { country: person.country },
      { continent: person.continent },
      { age: person.age },
      { language: person.language },
      {
        greeting: `Hi ${person.firstName}, what do you like the most about ${
          person.language
        }?`
      }
    );
  });
  return greetings;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...