【问题标题】:underscore loop over array of objects modify certain objects and remove some objects对象数组上的下划线循环修改某些对象并删除某些对象
【发布时间】:2016-08-02 20:33:14
【问题描述】:

假设我有一个对象数组,

[{"month":"03-2016","isLate":"N","transactionCount":4,"transactionAmount":8746455},{"month":"05-2016","isLate":"N","transactionCount":5,"transactionAmount":-40004952945.61},{"month":"06-2016","isLate":"N","transactionCount":1,"transactionAmount":100000},{"month":"04-2016","isLate":"N","transactionCount":6,"transactionAmount":-117189.89},{"month":"02-2016","isLate":"N","transactionCount":4,"transactionAmount":-5331000},{"month":"04-2016","isLate":null,"transactionCount":2,"transactionAmount":-4888.89},{"month":"03-2016","isLate":null,"transactionCount":3,"transactionAmount":5000}]

下划线或javascript中是否有一个函数,我可以根据某些条件循环遍历项目,删除某些对象,否则修改对象(向对象添加更多信息)并返回数据。

【问题讨论】:

  • 当然可以,但是您必须更加具体。你想要的条件和输出到底是什么?
  • 移除没有isLate的元素":"N",如果修改add属性为元素mm,包含字符串'Jan', 'Feb'中的月份

标签: javascript arrays angularjs object underscore.js


【解决方案1】:

您可以使用纯 JavaScript:

  • 删除某些对象:使用filter()
  • 修改对象(在对象中添加更多信息):使用map()

例如:

var input = [
  {
    "month": "03-2016",
    "isLate": "N",
    "transactionCount": 4,
    "transactionAmount": 8746455
  },
  {
    "month": "05-2016",
    "isLate": "N",
    "transactionCount": 5,
    "transactionAmount": -40004952945.61
  },
  {
    "month": "06-2016",
    "isLate": "N",
    "transactionCount": 1,
    "transactionAmount": 100000
  },
  {
    "month": "04-2016",
    "isLate": "N",
    "transactionCount": 6,
    "transactionAmount": -117189.89
  },
  {
    "month": "02-2016",
    "isLate": "N",
    "transactionCount": 4,
    "transactionAmount": -5331000
  },
  {
    "month": "04-2016",
    "isLate": null,
    "transactionCount": 2,
    "transactionAmount": -4888.89
  },
  {
    "month": "03-2016",
    "isLate": null,
    "transactionCount": 3,
    "transactionAmount": 5000
  }
];

// Helper array to translate month number to month name 
var monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
];

input = input
    // only get the entries which don't have isLate=N:
    .filter( o => o.isLate !== 'N' )
    // add a property "mm":
    .map( o => Object.assign(o, { mm: monthNames[+o.month.substr(0,2)-1] }) );

// Output result
console.log(input);

对于不支持 ES6 的 JavaScript 环境,将 input = 语句替换为:

input = input
    // only get the entries which don't have isLate=N:
    .filter( function (o) {
        return o.isLate !== 'N'; 
    })
    // add a property "mm":
    .map( function (o) {
        o.mm = monthNames[+o.month.substr(0,2)-1];
        return o;
    });

【讨论】:

  • 这很好但是我不认为这与 IE 兼容,它给出错误
  • @ua_boaz 如果您不使用 ES6 转换器转换代码,请不要使用箭头函数。我不确定为什么人们在他们的答案中使用箭头函数而不提及兼容性问题。
  • 我为那些使用尚不支持 ES6 中引入的箭头功能的浏览器的用户添加了 ES5 代码。
【解决方案2】:

是的,使用 filter()

var resArray = myArray.filter(x => x.transactionCount != 1);

在这个例子中,我删除了带有属性 transactionCount === 1 的元素

【讨论】:

    猜你喜欢
    • 2020-07-15
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    相关资源
    最近更新 更多