【问题标题】:Renaming object properties in an array of objects重命名对象数组中的对象属性
【发布时间】:2020-06-02 13:23:34
【问题描述】:

我有以下结构:

const data = {
    invoices: [
        {
            Date: "2018-12-18T00:00:00.000Z",
            InvoiceNumber: "59"
        },
        {
            Date: "2018-12-18T00:00:00.000Z",
            InvoiceNumber: "59"
        }
    ]
};

我想将 InvoiceNumber 的所有实例重命名为 CreditNoteNumber,以便为我提供以下信息:

const data = {
    invoices: [
        {
            Date: "2018-12-18T00:00:00.000Z",
            CreditNoteNumber: "59"
        },
        {
            Date: "2018-12-18T00:00:00.000Z",
            CreditNoteNumber: "59"
        }
    ]
};

我已经尝试过各种方法,例如:

var changed = data.invoices.map(function(item) {
    return {
        ...data.invoices,
        CreditNoteNumber: item.InvoiceNumber
    };
});

然而,价差将 CreditNoteNumber 推到对象之外。

【问题讨论】:

    标签: javascript arrays object destructor


    【解决方案1】:

    只需使用解构和重命名

    const data = {
      invoices: [
        {
          Date: "2018-12-18T00:00:00.000Z",
          InvoiceNumber: "59"
        },
        {
          Date: "2018-12-18T00:00:00.000Z",
          InvoiceNumber: "59"
        }
      ]
    };
    
    var changed = data.invoices.map(
      ({ Date, InvoiceNumber: CreditNoteNumber }) => ({ Date, CreditNoteNumber })
    );
    
    console.log(changed);

    【讨论】:

      【解决方案2】:

      在 JavaScript 中没有像“重命名”属性这样的操作。

      您需要删除不再希望保留的属性:

      const data = {
        invoices: [
          {
            Date: "2018-12-18T00:00:00.000Z",
            InvoiceNumber: "59"
          },
          {
            Date: "2018-12-18T00:00:00.000Z",
            InvoiceNumber: "59"
          }
        ]
      };
      
      const changed = data.invoices.map(item => {
        const obj = {
          ...item,
          CreditNoteNumber: item.InvoiceNumber
        };
        delete obj.InvoiceNumber
        return obj
      });
      
      console.log(changed)

      【讨论】:

      • @JimDover 如果你想改变原始对象,更好的方法是简单的forEach
      【解决方案3】:
      var changed = data.invoices.map(function(item) {
        return {
          Date: item.Date,
          CreditNoteNumber: item.InvoiceNumber
        };
      });
      

      【讨论】:

        【解决方案4】:

        您可以将函数map 与函数Object.assign 一起使用,如下所示:

        以下方法不会改变原始对象

        const data = {invoices: [{Date: "2018-12-18T00:00:00.000Z",InvoiceNumber: "59"},{Date: "2018-12-18T00:00:00.000Z",InvoiceNumber: "59"}]},
              result = data.invoices.map(({InvoiceNumber: CreditNoteNumber, ...items}) => Object.assign({}, items, {CreditNoteNumber}));
        
        console.log(result);

        如果你想改变原始对象,你可以使用 forEach 代替:

        const data = {invoices: [{Date: "2018-12-18T00:00:00.000Z",InvoiceNumber: "59"},{Date: "2018-12-18T00:00:00.000Z",InvoiceNumber: "59"}]};
        
        data.invoices.forEach((item) => {
          item.CreditNoteNumber = item.InvoiceNumber;
          delete item.InvoiceNumber;
        });
        
        console.log(data);

        【讨论】:

          【解决方案5】:

          最好的选择是使用属性 item.CreditNoteNumber 创建一个新对象 并使用 for each 循环迭代并将值重新分配给新对象。

          创建新对象后,将新对象分配给原始对象 数据发票。

          const data = {invoices: [{Date: "2018-12-18T00:00:00.000Z",InvoiceNumber: "59"},{Date: "2018-12-18T00:00:00.000Z",InvoiceNumber: "59"}]};
          
          var newInvoices = [];
          
          data.invoices.forEach((item) => {
           let invoice = {};
               invoice.Date = item.Date;
               invoice.CreditNoteNumber = item.InvoiceNumber;
          
            newInvoice.push(invoice);
          });
          
          data.invoices = newInvoices;
          
          console.log(data.invoices);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-30
            • 2017-12-11
            • 2021-01-22
            • 2020-04-19
            • 2011-11-10
            • 2014-04-15
            • 2022-10-19
            • 2018-08-31
            相关资源
            最近更新 更多