Возврат новой формы массива объектов с использованием JavaScript - PullRequest
0 голосов
/ 01 декабря 2018

Мой объект:

const data = {
  "rows": [
    {
      "code": "ct101",
      "username": "admin",
      "subscriptionExpiresOn": "2019-11-27T09:35:38.916Z",
    },
    {
      "code": "bt101",
      "username": "admin",
      "subscriptionExpiresOn": "2016-11-27T08:20:57.297Z",
    },
  ]
}

В моем объекте внутри массива строк есть ключ с именем 'subscriptionExpiresOn',

Я хочу проверить условие, если subscriptionExpiresOn равно

// Changing the value into 'Expired'
const data = {
  "rows": [
    {
      "code": "ct101",
      "username": "admin",
      "subscriptionExpiresOn": "2019-11-27T09:35:38.916Z",
    },
    {
      "code": "bt101",
      "username": "admin",
      "subscriptionExpiresOn": "Expired",
    },
  ]
}

Вот что я пытался с помощью метода карты:

const now = new Date();

data.rows.map((index) => {
  if (index.subscriptionExpiresOn < now) {
    return {
      subscriptionExpiresOn: 'Expired',
    };
  } else {
    return data;
  }
});

Но это не работает.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Это не работает, потому что:

  • подпись map - это функция, первым аргументом которой является элемент, а не индекс;
  • вы возвращаете только то, что выхочу изменить.Вместо этого возвращайте весь объект, перезаписывая старое значение новым;
  • в ветви else, вы возвращаете весь исходный массив, а не просто возвращаете элемент как есть;
  • вы сравниваете перемешивание с датой.

Вот рабочий код.

const data = {
  "rows": [
    {
      "code": "ct101",
      "username": "admin",
      "subscriptionExpiresOn": "2019-11-27T09:35:38.916Z",
    },
    {
      "code": "bt101",
      "username": "admin",
      "subscriptionExpiresOn": "2016-11-27T08:20:57.297Z",
    },
  ]
}

const now = new Date();

const result = data.rows.map((item) => {
  if (new Date(item.subscriptionExpiresOn) < now) {
    return {
      ...item,
      subscriptionExpiresOn: 'Expired',
    };
  } else {
    return item;
  }
});

console.log(result)
0 голосов
/ 01 декабря 2018

Поскольку вы пытаетесь изменить тот же массив, вы должны использовать Array.forEach .А для сравнения дат вам нужно будет преобразовать строку в объект даты.

const now = new Date();
const data = {"rows": [{"code": "ct101","username": "admin","subscriptionExpiresOn": "2019-11-27T09:35:38.916Z"},{"code": "bt101","username": "admin","subscriptionExpiresOn": "2016-11-27T08:20:57.297Z"}]};

data.rows.forEach(o => {
  if(new Date(o.subscriptionExpiresOn) < now) o.subscriptionExpiresOn = 'Expired'
});
console.log(data.rows);
0 голосов
/ 01 декабря 2018

Вам нужно несколько изменений.Во-первых, вам нужно преобразовать каждый row.subscriptionExpiresOn в объект даты, чтобы вы могли правильно сравнить с now.Кроме того, вам необходимо вернуть строку в дополнение к обновленному ключу, поэтому для этого я использую синтаксис распространения ES6 :

const data = {
  "rows": [
    {
      "code": "ct101",
      "username": "admin",
      "subscriptionExpiresOn": "2019-11-27T09:35:38.916Z",
    },
    {
      "code": "bt101",
      "username": "admin",
      "subscriptionExpiresOn": "2016-11-27T08:20:57.297Z",
    },
  ]
}

const now = new Date();

const mapped = data.rows.map((row) => {
  if (new Date(row.subscriptionExpiresOn) < now) {
    return {
      ...row,
      subscriptionExpiresOn: 'Expired',
    };
  } else {
    return row;
  }
});

console.log(mapped);

Тогда, если вы пытаетесь сохранить структуру, просто верните ее в исходном формате:

return { rows: mapped };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...