如何循环遍历对象数组并根据 JavaScript 中的条件添加新的对象键?

Posted

技术标签:

【中文标题】如何循环遍历对象数组并根据 JavaScript 中的条件添加新的对象键?【英文标题】:How to loop through array of objects and add new object key based on condition in JavaScript? 【发布时间】:2021-12-22 04:04:41 【问题描述】:

我有以下对象数组:

["id":0,"name":"Katy","age":22,
"id":2,"name":"Lucy","age":12,
"id":1,"name":"Jenna","age":45,
"id":3,"name":"Ellie","age":34]

我需要在对象 (PaymentCategory) 中添加另一个键,在其中添加具有最低 ID 的对象的键具有值“现金”、具有最高 ID 的键“卡”以及介于“支票”之间的所有对象;该数组还必须按 ID 排序。

因此需要的输出是:

["PaymentCategory":"Cash","id":0,"name":"Katy","age":22,
"Payment Category":"Cheque","id":1,"name":"Jenna","age":45,
"Payment Category":"Cheque","id":2,"name":"Lucy","age":12,
"Payment Category":"Card","id":3,"name":"Ellie","age":34]

我们怎样才能以最有效的方式实现这一结果,即最少的迭代次数,最高的性能?

这是我尝试过的:

const min = array.reduce((prev,curr)=> prev.id<curr.id?prev:curr)
  const max = array.reduce((prev,curr)=> prev.id>curr.id?prev:curr)
  min.PaymentCategory = "Cash"
  max.PaymentCategory = "Credit"
  const result =[min, max]

这个问题是:

    我循环了两次,一次用于max,一次用于min。 如何获得“中间”值?

【问题讨论】:

抱歉@Peter Seliger 迟到了回复和接受答案,我在这期间失去了帐户访问权限,因此无法查看/接受答案。感谢 Peter Seliger 和 Ali 花时间回答这个问题,我能够通过代码验证输出。 【参考方案1】:

以下提供的方法很简单,首先将sort 的浅数组副本 ([...sampleData]) 的项目按 id 值的升序 (.sort((a, b) =&gt; a.id - b.id)) 进行处理。

最后的任务以创建浅表副本 ( ...item ) 的方式执行 map 每个(排序的)项目,此外还创建一个 'Payment Category' 条目,其中第一个项目 (idx === 0) 被分配了 @ 987654333@ 值,最后一项 ( (idx === arr.length - 1) ) 被分配 'Card' 值,所有其他项被分配 'Cheque' 值。

整个方法不会改变最初提供的数据...

const sampleData = [
   id: 0, name: "Katy", age: 22 ,
   id: 2, name: "Lucy", age: 12 ,
   id: 1, name: "Jenna", age: 45 ,
   id: 3, name: "Ellie", age: 34 ,
];

console.log(
  'mapped `sampleData` items ...',

  [...sampleData]
    .sort((a, b) => a.id - b.id)
    .map((item, idx, arr) => (
      ...item,
      'Payment Category': ((idx === 0)
        && 'Cash') || ((idx === arr.length - 1)
        && 'Card') || 'Cheque',
    ))
);
console.log('unmutated `sampleData` ...', sampleData);
.as-console-wrapper  min-height: 100%!important; top: 0; 

上述方法以一种更具可读性的方式...

const copyItemAndAugmentPaymentCategory = (item, idx, arr) => (
  ...item,
  'Payment Category': ((idx === 0)
    && 'Cash') || ((idx === arr.length - 1)
    && 'Card') || 'Cheque',
);
const compareItemIdPrecedenceAscending = (a, b) => a.id - b.id;

console.log(
  [
     id: 0, name: "Katy", age: 22 ,
     id: 2, name: "Lucy", age: 12 ,
     id: 1, name: "Jenna", age: 45 ,
     id: 3, name: "Ellie", age: 34 ,
  ]
  .sort(compareItemIdPrecedenceAscending)
  .map(copyItemAndAugmentPaymentCategory)
);
.as-console-wrapper  min-height: 100%!important; top: 0; 

【讨论】:

【参考方案2】:

你可以这样做

const array =["id":0,"name":"Katy","age":22,
"id":2,"name":"Lucy","age":12,
"id":1,"name":"Jenna","age":45,
"id":3,"name":"Ellie","age":34]

const arrayLength= array.length
  
const newA=array.map( (element,index) =>   if (index===0) return "PaymentCategory":"Cash", ...element
else if ( index===arrayLength-1 )return "PaymentCategory":"Card", ...element
else return "PaymentCategory":"Cheque", ...element)

查看数组中的 map 方法以了解更多信息:https://learnjsx.com/category/2/posts/es6-mapFunction

【讨论】:

id不等于数组长度怎么办?

以上是关于如何循环遍历对象数组并根据 JavaScript 中的条件添加新的对象键?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript处理对象数组

Javascript处理对象数组

JavaScript循环遍历

循环遍历多维数组以生成新数据并在节点 js / javascript 中追加新的键值

Node.js 循环遍历嵌套的 Javascript 对象

循环遍历数组并显示年份一次,几个月后