Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于属性合并对象数组中的元素_Javascript_Arrays_Ecmascript 6 - Fatal编程技术网

Javascript 基于属性合并对象数组中的元素

Javascript 基于属性合并对象数组中的元素,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有一个对象数组。每个对象都有一个amount和value属性。如果一个对象具有相同的数量值,我希望将该值添加到该对象 下面是一个示例阵列: const array = [ { "key": 1, "amount": 11, "value": "were" }, { "key": 2, "amount": 6, "value": "locomotives" }, { "key": 3, "amount": 5,

我有一个对象数组。每个对象都有一个amount和value属性。如果一个对象具有相同的数量值,我希望将该值添加到该对象

下面是一个示例阵列:

const array = [
  {
    "key": 1,
    "amount": 11,
    "value": "were"
  },
  {
    "key": 2,
    "amount": 6,
    "value": "locomotives"
  },
  {
    "key": 3,
    "amount": 5,
    "value": "They"
  },
  {
    "key": 4,
    "amount": 5,
    "value": "with"
  },
  {
    "key": 5,
    "amount": 4,
    "value": "used"
  }
]
我想将其转换为类似以下内容:

const array = [
  {
    "key": 1,
    "amount": 11,
    "value": "were"
  },
  {
    "key": 2,
    "amount": 6,
    "value": "locomotives"
  },
  {
    "key": 3,
    "amount": 5,
    "value": "They, width"
  },
  {
    "key": 5,
    "amount": 4,
    "value": "used"
  }
]

我尝试了
reduce
map
,但我似乎无法让它加入,

我认为应该使用
。reduce()

const数组=[
{
"关键":一,,
“金额”:11,
“价值”:“曾经”
},
{
"关键":二,,
“金额”:6,
“价值”:“机车”
},
{
"关键":三,,
“金额”:5,
“价值”:“他们”
},
{
"关键":四,,
“金额”:5,
“值”:“带”
},
{
“关键”:5,
“金额”:4,
“值”:“已使用”
}
];
const result=array.reduce((a,c)=>{
const found=a.find(e=>e.amount==c.amount);
如果(找到)found.value=`${found.value},${c.value}`;
发现退货?a:a.concat(c);
}, []);
控制台日志(结果)您可以通过按
金额
值编制索引来使用ES6。如果对象的
数量
值已存在于地图中,则可以更新其
以包括当前对象
。如果
amount
值不在地图中,可以将其设置为键,将当前对象设置为值。最后,您可以使用从迭代器中获取对象值数组,迭代器由
.values()

const数组=[{“key”:1,“amount”:11,“value”:“were”},{“key”:2,“amount”:6,“value”:“motors”},{“key”:3,“amount”:5,“value”:“They”},{“key”:4,“amount”:5,“value”:“with”},{“key”:5,“amount”:4,“value”:“used”};
常数res=Array.from(Array.reduce)(m,o)=>{
const curr=m.get(o.amount);
返回m.set(o.amount,curr&&{…curr,value:`${curr.value},${o.value}}}}| | o);
},新映射)。值());
控制台日志(res)我的

常量数组1=
[{key:1,amount:11,value:“were”}
,{关键字:2,金额:6,值:“机车”}
,{key:3,amount:5,value:“他们”}
,{key:4,amount:5,value:“带”}
,{key:5,amount:4,value:“used”}
] 
常数array2=array1.reduce((a,c)=>
{
让same=a.find(e=>e.amount==c.amount)
如果(相同)相同的.value+=','+c.value
否则a.push(c)
归还
},[])

console.log(array2)
reduce
方法的每次迭代中,如果已经添加了
值,我们可以添加

const result = array.reduce((a, c) => {
  a[c.amount] = a[c.amount] || c;
  if ((Object.keys(a).includes(c.amount.toString())) && (a[c.amount].value!= c.value))
      a[c.amount].value += ', ' + c.value;
  return a;
}, {});
例如:

const数组=[
{
"关键":一,,
“金额”:11,
“价值”:“曾经”
},
{
"关键":二,,
“金额”:6,
“价值”:“机车”
},
{
"关键":三,,
“金额”:5,
“价值”:“他们”
},
{
"关键":四,,
“金额”:5,
“值”:“带”
},
{
“关键”:5,
“金额”:4,
“值”:“已使用”
}
];
const result=array.reduce((a,c)=>{
a[c.金额]=a[c.金额]| | c;
if((Object.keys(a).includes(c.amount.toString())&&(a[c.amount].value!=c.value))
a[c.金额].值+=','+c.值;
返回a;
}, {});

控制台日志(结果)使用
forEach
循环并构建一个对象。如果
amount
键已存在,则追加值字符串

const update=data=>{
常数res={};
data.forEach(项=>{
res[项目金额]=
项目.以实物表示的金额
? {
…资源[项目金额],
值:`${res[item.amount].value},${item.value}`
}
:{……项目};
});
返回Object.values(res);
};
常量数组=[
{
重点:1,,
金额:11,
价值:“我们”
},
{
重点:二,,
金额:6,
价值:“机车”
},
{
重点:三,,
金额:5,
价值观:“他们”
},
{
重点:四,,
金额:5,
价值:“与”
},
{
重点:五,,
金额:4,
值:“已使用”
}
];

日志(更新(数组))输入和输出在我看来都是一样的。@customcommander“它们”和“宽度”具有相同的“数量”,因此聚合在同一个对象中。@customcommander正确-这就是我试图实现的目标。@customcommander正确!我想你可以提到你想要分组的键。@RobGleeson我会使用一个映射来处理这种情况,其中键可以是“数量”,值可以是像{key,value}这样的对象。然后我将遍历数组,并根据上面提到的结构填充映射。如果您感兴趣,我可以与您分享此代码。:)