【问题标题】:Change value in JSON array and return updated array JS更改 JSON 数组中的值并返回更新后的数组 JS
【发布时间】:2017-01-31 13:38:35
【问题描述】:

我有一个 JSON 对象,我在其中获取产品价格(数字)作为值。

我想要的是将价格值转换为现有对象中的字符串

我使用地图功能:

var prods = [
  {
    "id": "id-1",
    "price": 239000,
    "info": "info-1"
  },

  {
    "id": "id-2",
    "price": 90770,
    "info": "info-2"
  },

  {
    "id": "id-3",
    "price": 200787868,
    "info": "info-3"
  },
];


prods.map(function(a) {
         a.price.toString()
        .replace(/(\d)(?=(\d{3})+(\D|$))/g, '$1 ');
})

我希望 ma​​p 函数更新我的 prods 对象,但它保持不变。

(Un)working JS Bin

我想知道,如何将初始对象更新为我需要的对象?

【问题讨论】:

  • map 返回一个新数组,因此您必须执行类似 newarr = prods.map(function(a) { return a.price.toString() .replace(/(\d)(? =(\d{3})+(\D|$))/g, '$1'); });
  • 注意“return”是必须的

标签: javascript arrays json function


【解决方案1】:

字符串是不可变的。

String#replace 返回一个新字符串,因此您需要一个赋值。

虽然您只需要更改一个属性,但您可以使用Array#forEach

var prods = [{ id: "id-1", price: 239000, info: "info-1" }, { id: "id-2", price: 90770, info: "info-2" }, { id: "id-3", price: 200787868, info: "info-3" }];

prods.forEach(function(a) {
    a.price = a.price.toString().replace(/(\d)(?=(\d{3})+(\D|$))/g, '$1 ');
});

console.log(prods);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    您需要在替换后将值分配回“价格”

    prods.map(function(a) {
             a.price = a.price.toString()
            .replace(/(\d)(?=(\d{3})+(\D|$))/g, '$1 ');
    })
    

    【讨论】:

      【解决方案3】:

      你需要使用这个

      示例代码

      prods.map(function(a) {
                   a.price = ""+a.price;
      })
      

      【讨论】:

        【解决方案4】:

        请注意map 对数组上的每个元素应用一个函数,您可以返回新数组,它不会修改现有数组,因此您需要将新数组分配给某个变量。

        var prods = [
          {
        	"id": "id-1",
        	"price": 239000,
        	"info": "info-1"
          },
          
          {
        	"id": "id-2",
        	"price": 90770,
        	"info": "info-2"
          },
          
          {
        	"id": "id-3",
        	"price": 200787868,
        	"info": "info-3"
          },
        ];
        
        
        prods = prods.map(function(a) {
          a.price = a.price.toString()
           .replace(/(\d)(?=(\d{3})+(\D|$))/g, '$1 ');
          return a;
        });
        console.log(prods);

        【讨论】:

          【解决方案5】:

          您只需更新传递给 map 函数的 lambda 内的价格。 您应该创建一个新数组来存储新值。

          let newArray= [];
          prods.map(function(a) {
               a.price = a.price.toString()
              .replace(/(\d)(?=(\d{3})+(\D|$))/g, '$1 ');
               newArray.push(a);
          })
          

          这样就可以解决问题,让您的原始数组保持不变。

          Try it out here in the Ramda REPL

          问候, 费利克斯

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-10-19
            • 2020-04-06
            • 1970-01-01
            • 2014-12-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多