оператор спреда не работает - PullRequest
0 голосов
/ 06 марта 2020

'browsed' - это массив объектов с данными для каждой буквы:

[
    {
        allowMultiSign: undefined,
        allowSingleSign: "1",
        assignmentStatus: "Browsed",
        disclaimer: null,
        form16: false,
        letterDate: "06-Mar-2020",
        title: "letter02",
        safetyLetterId: 987
    },
    {
        allowMultiSign: undefined,
        allowSingleSign: "1",
        assignmentStatus: "Browsed",
        disclaimer: null,
        form16: false,
        letterDate: "06-Mar-2020",
        title: "letter01",
        safetyLetterId: 123
    },
    {
        allowMultiSign: undefined,
        allowSingleSign: "1",
        assignmentStatus: "Browsed",
        disclaimer: null,
        form16: false,
        letterDate: "06-Mar-2020",
        title: "letter03",
        safetyLetterId: 456
    },
    {
        allowMultiSign: undefined,
        allowSingleSign: "1",
        assignmentStatus: "Browsed",
        disclaimer: null,
        form16: false,
        letterDate: "06-Mar-2020",
        title: "letter04",
        safetyLetterId: 789
    }
]

Я хочу:

  1. отфильтровать этот массив для писем, которые являются form16 ложными и множественными знаками true
  2. создать объект для каждой буквы, который проходит фильтр, который будет содержать только идентификатор буквы и заголовок
  3. concat каждый объект внутри объекта с именем multisign

1 и 2 работают просто отлично (я регистрировал каждый шаг). Проблема с # 3

, когда я регистрирую конечный результат - многосигнал, я вижу только последний объект. Я ожидаю увидеть все 4 объекта в мультизнаке.

Я использовал оператор распространения ранее для этой же точной задачи. Мне интересно, если я просто упускаю мелкие детали или это проблема совместимости. Я использую javascript 6.9.0.

            let multisign = {};
            browsed.forEach(letter => {
                if (letter.form16 == false && letter.allowMultiSign != false) {
                    let idAndTitle = {
                        safetyLetterId: letter.safetyLetterId,
                        title: letter.title
                    }
                    multisign = { ...multisign, ...idAndTitle }
                }
            });

            console.log(multisign);
        }

пример вывода

{
    {
        safetyLetterId: 789,
        title: "letter04"
    }
}

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Это происходит потому, что когда вы распространяете объект с теми же ключами, они переопределяются, см .: multisign = { ...multisign, ...idAndTitle }

Вот почему вы получаете только последний.

Мое предложение будет либо сделайте multisign массивом и добавьте в него sh объекты, либо вам нужно преобразовать ключи для idAndTitle каждого объекта (возможно, добавить индекс)

РЕДАКТИРОВАТЬ:

Если вы хотите чтобы изменить ключи, вы должны изменить idAndTitle объект

browsed.forEach((letter, index) => {
                if (letter.form16 == false && letter.allowMultiSign != false) {
                   let idAndTitle = {
                        [`safetyLetterId${index}`]: letter.safetyLetterId,
                        [`title${index}`]: letter.title
                    }
...

Теперь объект с несколькими знаками должен выглядеть следующим образом

{
  {
    safetyLetterId0: '...'
    title0: '...'
  },
  {
    safetyLetterId1: '...'
    title1: '...'
  },
  ...
}

И, как вы можете видеть, это становится ужасно, поэтому я предложил бы заменить multisign на массив и pu sh новый obj к нему

0 голосов
/ 07 марта 2020

Я не совсем уверен, чего вы пытаетесь достичь, и, кажется, у вас меньше опыта с javascript.

, но после просмотра кода я чувствую, что вы пытаетесь отфильтровать письмо объекты, которые имеют form16 как false и allowMultiSign как true. если это так, попробуйте следующее:

            let multisign = [];
            browsed.forEach(letter => {
                if (letter.form16 == false && letter.allowMultiSign != false) {
                    let idAndTitle = {
                        safetyLetterId: letter.safetyLetterId,
                        title: letter.title
                    }
                    multisign.push(idAndTitle);
                }
            });

            console.log(multisign);
...