为映射键名称添加下划线,带增量



我有一个js对象,如下所示:

[{"product":7001,"quantity":1},{"product":3002,"quantity":1},{"product":4002,"quantity":4}]

我需要能够逐步重命名密钥,例如:

[{"product":7001,"quantity":1},{"product1":3002,"quantity1":1},{"product2":4002,"quantity2":4}]

我一直在研究为键名添加增量的东西,但这不适用于我正在使用的对象类型。

任何建议将不胜感激。

/*
this doesn't work
var a = [
  {product : "3002", quantity: 1},
  {product : "4001", quantity : 3}
  ];
*/
// this updates the key, but not in the way I need it to.
var a =  {product : "3002", quantity: 1}
  var n = 0;
  function increment(string)
  {
    n++
      return string + n;
  }
  var b = {};
  var map = {
      name : "name"
  };
  var keymap = {};
  _.each(a, function(value, key) {
      var oldkey = key;
      key = increment(key);
      keymap[oldkey] = key;
  });
  _.each(a, function(value, key) {
      key = keymap[key] || key;
      b[key] = value;
  });
  console.log('increment keys: ' + JSON.stringify(b));

似乎是一个不寻常的请求和不寻常的结构,但这里有一个产生预期结果的映射/减少

var data = [{"product":7001,"quantity":1},{"product":3002,"quantity":1},{"product":4002,"quantity":4}],
res = data.map((o,i)=>Object.keys(o).reduce((o2, key)=> i ? (o2[key+i] = o[key],o2):o,{}))
console.log(res)

我有一个更好的主意。为什么不向对象添加 ID 键,而不是更改键名称。以下代码循环访问数组并创建一个新数组。新数组中的对象现在具有与产品索引对应的id键。

    let products = [{"product":7001,"quantity":1},{"product":3002,"quantity":1},{"product":4002,"quantity":4}];
    products = products.map((item, index) => Object.assign(item, { id: index + 1 }));
    console.log(products); 

使用 _.map() 迭代数组。由于下划线缺少映射键的功能,因此您可以_.invert()键和值,使用 _.mapObject() 更新键(当前值(,然后再次_.invert()

var data = [{"product":7001,"quantity":1},{"product":3002,"quantity":1},{"product":4002,"quantity":4}]
var result = _.map(data, function(o, i) {
  return _.chain(o)
    .invert()
    .mapObject(function(v) { return v + (i || '') })
    .invert()
    .value()
})
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

在 ES6 中使用Array.map()和计算的属性名称执行此操作要容易得多:

var data = [{"product":7001,"quantity":1},{"product":3002,"quantity":1},{"product":4002,"quantity":4}]
var result = data.map(({ product, quantity }, i) => ({
  [`product${i || ''}`]: product,
  [`quantity${i || ''}`]: quantity
}));
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

最新更新