Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Algorithm_Loops_Sorting - Fatal编程技术网

Javascript 获取对象数组中重复键的值

Javascript 获取对象数组中重复键的值,javascript,arrays,algorithm,loops,sorting,Javascript,Arrays,Algorithm,Loops,Sorting,我有一个这样的对象数组。我想去掉重复的键(名称),在一个数组中只有一个名称及其所有相关值 let array = [ { name: "dimensions", value: "dimensions value 1" }, { name: "weight", value: "weight value 1" }, { name: "dimensions", value: "dimensions value 2" }, { name: "weight", value

我有一个这样的对象数组。我想去掉重复的键(名称),在一个数组中只有一个名称及其所有相关值

let array = [ 
  { name: "dimensions", value: "dimensions value 1" },
  { name: "weight",     value: "weight value 1" },
  { name: "dimensions", value: "dimensions value 2" },
  { name: "weight",     value: "weight value 3" },
  { name: "dimensions", value: "dimensions value 3" },
  { name: "weight",     value: "weight value 3" } 
]
我想把它变成这样的事情:

result = [ {
  name : "dimensions", 
  values : ["dimention value 1", "dimention value 2", "dimention value 3"] 
    }, {
  name : "weights", 
  values : ["weight value 1", "weight value 2", "weight value 3"] 
} ]
[
  { name: "dimensions", values: [ "dimensions value 1"] },
  { name: "weight",     values: [ "weight value 1"] }
]
注意:数组中对象的计数是可变的。“重量”、“尺寸”、“颜色”、“品牌”等

到目前为止,我所尝试的:

let flags = [], output = [], l = array.length;

for (let i = 0; i < l; i++) {
    if (flags[array[i].name])
      continue;

    flags[array[i].name] = array[i].name;

    output.push({
        name : array[i].name,
        values : [array[i].value]
    });
}
let数组=[
{name:“dimensions”,value:“dimensions value 1”},
{名称:“权重”,值:“权重值1”},
{名称:“维度”,值:“维度值2”},
{名称:“重量”,值:“重量值3”},
{名称:“维度”,值:“维度值3”},
{名称:“重量”,值:“重量值3”}
]
让flags=[],output=[],l=array.length;
for(设i=0;i
您可以使用
数组#reduce
Object.values()
根据
名称对数组进行分组

let array=[{name:“维度”,value:“维度值1”},{name:“权重”,value:“权重值1”},{name:“维度值2”},{name:“权重”,value:“权重值3”},{name:“维度”,value:“维度值3”},{name:“权重”,value:“权重值3”},
结果=Object.values(array.reduce((r,{name,value})=>{
r[name]=r[name]|{name,值:[]};
r[name].values.push(值);
返回r;
},{}));
控制台日志(结果)
您可以使用
array#reduce
Object.values()
根据
名称对数组进行分组

let array=[{name:“维度”,value:“维度值1”},{name:“权重”,value:“权重值1”},{name:“维度值2”},{name:“权重”,value:“权重值3”},{name:“维度”,value:“维度值3”},{name:“权重”,value:“权重值3”},
结果=Object.values(array.reduce((r,{name,value})=>{
r[name]=r[name]|{name,值:[]};
r[name].values.push(值);
返回r;
},{}));

控制台日志(结果)
您可以使用ES6
Map
存储值,然后使用扩展语法
获取对象数组中的值

让数组=[{name:“维度”,值:“维度值1”},{name:“权重”,值:“权重值1”},{name:“维度”,值:“维度值2”},{name:“权重”,值:“权重值3”},{name:“维度”,值:“维度值3”},{name:“权重”,值:“权重值3”}]
const map=array.reduce((r,{name,value})=>{
如果(!r.has(name))r.set(name,{name,values:[value]});
else r.get(name).values.push(value)
返回r;
},新地图);
const result=[…map.values()];

console.log(result)
您可以使用ES6
Map
存储值,然后使用扩展语法
获取对象数组中的值

让数组=[{name:“维度”,值:“维度值1”},{name:“权重”,值:“权重值1”},{name:“维度”,值:“维度值2”},{name:“权重”,值:“权重值3”},{name:“维度”,值:“维度值3”},{name:“权重”,值:“权重值3”}]
const map=array.reduce((r,{name,value})=>{
如果(!r.has(name))r.set(name,{name,values:[value]});
else r.get(name).values.push(value)
返回r;
},新地图);
const result=[…map.values()];

console.log(result)
当其他答案产生了您想要的输出时,您可能会发现使用键为“维度”和“权重”且其值为字符串数组的对象更容易。您可以使用稍微简单一点的
reduce

const out = array.reduce((p, c) => {
  p[c.name] = p[c.name] || [];
  p[c.name].push(c.value);
  return p;
}, {});
输出

{
  "dimensions": [
    "dimensions value 1",
    "dimensions value 2",
    "dimensions value 3"
  ],
  "weight": [
    "weight value 1",
    "weight value 3",
    "weight value 3"
  ]
}
这只意味着您现在可以访问以下属性:

out.dimensions[0]
而不是

out[0].values

这在我看来不太有用。

虽然其他答案已经产生了您想要的输出,但您可能会发现,使用键为“维度”和“权重”且其值为字符串数组的对象更容易。您可以使用稍微简单一点的
reduce

const out = array.reduce((p, c) => {
  p[c.name] = p[c.name] || [];
  p[c.name].push(c.value);
  return p;
}, {});
输出

{
  "dimensions": [
    "dimensions value 1",
    "dimensions value 2",
    "dimensions value 3"
  ],
  "weight": [
    "weight value 1",
    "weight value 3",
    "weight value 3"
  ]
}
这只意味着您现在可以访问以下属性:

out.dimensions[0]
而不是

out[0].values
在我看来,这没什么用处