javascript - карта с условно измененным вложенным полем - PullRequest
2 голосов
/ 19 сентября 2019

Учитывая массив, такой как:

people = [
    {
        name: 'Bob',
        sex: 'male',
        address:{
          street: 'Elm Street',
          zip: '12893'
        }
    },
    {
        name: 'Susan',
        sex: 'female',
        address:{
          street: 'Hickory Street',
          zip: '00000'
        }
    }
]

Я пытаюсь написать функцию, которая изменит конкретные экземпляры '00000' во вложенном поле 'zip' в строку '12893' и вернетновый массив идентичен исходному массиву за исключением с исправленными значениями.До сих пор я пытался использовать функцию:

function zipFix (initialArray) {
    return initialArray.map(function(person) {
        if(person.address.zip === '00000')
          person.address.zip = "12893"
        return person
    });
}

Я знаю, что эта функция изменяет значения в 'initialArray', чего не должно быть.Как я могу написать свою функцию, чтобы эффективно использовать функцию map для создания нового исправленного массива?Спасибо.

Ответы [ 4 ]

2 голосов
/ 19 сентября 2019

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

const people = [{name: 'Bob',sex: 'male',address:{street: 'Elm Street',zip: '12893'}},{name: 'Susan',sex: 'female',address:{street: 'Hickory Street',zip: '00000'}}]

function zipFix (initialArray) {
    return initialArray.map(function(person) {
      let newObj = JSON.parse(JSON.stringify(person))
        if(newObj.address.zip === '00000')
           newObj.address.zip ="12893"
      return newObj
    });
}

console.log(zipFix(people))
2 голосов
/ 19 сентября 2019

people = [{
    name: 'Bob',
    sex: 'male',
    address: {
      street: 'Elm Street',
      zip: '12893'
    }
  },
  {
    name: 'Susan',
    sex: 'female',
    address: {
      street: 'Hickory Street',
      zip: '00000'
    }
  }
]

function zipFix (initialArray) {
  return (initialArray.map(({address, ...p}) => (
    address.zip !== '00000' ? { ...p, address } : {
      ...p,
      address: {
        ...address,
        zip: '12893'
      }
    }
  )));
}

console.log(zipFix(people));
2 голосов
/ 19 сентября 2019

При map -перечислении значений вам нужно будет создать копию каждого объекта.Самый простой способ сделать это - использовать синтаксис объекта ({...obj}).

. Это приведет к "распространению" всех значений (name, adress и т. Д.) Вновый объект.Таким образом, любые изменения не изменят его.Тем не менее, это «мелкий» смысл, то есть это будет новым объектом, но его значения одинаковы.Таким образом, поскольку address также является объектом, нам также необходимо скопировать его, следовательно, и причина вложенного разброса значения address.

people = [{
    name: 'Bob',
    sex: 'male',
    address: {
      street: 'Elm Street',
      zip: '12893'
    }
  },
  {
    name: 'Susan',
    sex: 'female',
    address: {
      street: 'Hickory Street',
      zip: '00000'
    }
  }
]

function zipFix(initialArray) {
  return initialArray.map(function(person) {
    // Create a new "copy" of the person. Using object spread
    // will create a "shallow" copy, so since address is also an
    // object it will have to be spread (same for other objects that might
    // be mutated).
    const newValue = { ...person, address: { ...person.address }}

    if (newValue.address.zip === '00000') {
      newValue.address.zip = "12893";
    }

    return newValue
  });
}

console.log(zipFix(people))
console.log(people) // unchanged
1 голос
/ 19 сентября 2019

Вы можете сделать:

const people = [{name: 'Bob',sex: 'male',address: {street: 'Elm Street',zip: '12893'}},{name: 'Susan',sex: 'female',address: {street: 'Hickory Street',zip: '00000'}}]
const zipFix = people.map(({address, ...p}) => ({
  ...p,
  address: {
    ...address,
    zip: address.zip === '00000' ? '12893' : address.zip
  }
}))

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