代码之家  ›  专栏  ›  技术社区  ›  Sameer

使用javascript返回新形式的对象数组

  •  0
  • Sameer  · 技术社区  · 7 年前

    我的目标:

    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",
        },
      ]
    }
    

    下面是我使用map方法尝试的内容:

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

    但它不起作用。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Nikhil Aggarwal    7 年前

    当您尝试对同一数组进行变异时,应该使用 . 对于日期比较,您需要将字符串转换为日期对象。

    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);
        2
  •  2
  •   Blue    7 年前

    你需要一些改变。首先,您需要转换每个 row.subscriptionExpiresOn 到日期对象,以便可以正确地与 now . 此外,除了更新的键之外,还需要返回行,因此我使用 ES6 spread syntax

    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 };
    
        3
  •  0
  •   Lazar Ljubenović    7 年前

    它不起作用,因为:

    • 签名 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)