JavaScript:将两个数组组合成一个对象

问题描述 投票:0回答:3

我有两个数组,

slicesRank
slicesCount
,其结构如下。每个元素都有 id 和 value,是一个 46 个数组。Values 由日期和测量值组成。

例如

sliceRank[0]:   
{
    id: Catan = rank, 
    values(Array(46)) : {date, measurement}
}


sliceCount[0]:
{
    id: Catan=count, 
    values(Array(46)) : {date, measurement}
}

如果我想将id名称中具有相同前缀的元素组合在一起,该怎么办?例如,这两个数组中的第一个元素。

所需的结构是

{
    id: Catan, 
    values(Array(46)) : {date, count, rank}
}

我尝试了以下操作,但

values
显示未定义。

for(i = 0; i < slicesRank.length; i++) {
    var newElement = {};
    newElement['id'] = slicesRank[i].id.replace('=rank', '');
    newElement['values'] = {
      date: slicesRank[i].date,
      rank: slicesRank[i].measurement,
      count: slicesCount[i].measurement
    };
    sliceNew.push(newElement);
};

slicesRank
的结构是这样的:

enter image description here

enter image description here

javascript arrays
3个回答
1
投票

这是您可以尝试的示例转换:

const combined = slicesRank.map((rank) => {
  const id = rank.id.replace("=rank", "");
  const count = slicesCount.find(
    (count) => count.id.replace("=count", "") === id
  );
  return {
    id,
    values: rank.values.map((val, index) => ({
      date: val.date,
      rank: val.measurement,
      count: count?.values[index].measurement
    }))
  };
});

这是一个工作示例 https://codesandbox.io/s/awesome-lovelace-e31zj?file=/src/index.js


1
投票

通过切片我想你的意思是

Array

const combinedArray = sliceRank.map((sliceItem, itemIndex) => {
    return {
        id,
        values: sliceItem.values.map(({ date, measurement }, valueIndex) => ({
            date,
            count: sliceCount[itemIndex][valueIndex].measurement,
            rank: measurement,
        }))
    }
})

此解决方案返回使用

sliceRank
sliceCount
组合的对象数组。所以现在每个数组项都包含结构
values
{ date, count, rank }
Array.map
是不可变的,因此两个切片都是相同的。


0
投票

你可以试试这个。

let sliceRank=[{id: "Catan=rank",  values : [{"date":"10/10/2020", "measurement":120} ]}];
let sliceCount=[{id: "Catan=count",  values :[{"date":"10/10/2020", "measurement":20} ] }];

let newData=[];

const data = sliceRank.map((slice, sliceIndex) => {
    return {
        id:slice.id.split("=")[0],
        values: slice.values.map(({ date, measurement }, valueIndex) => ({
            date,            
            rank: measurement,
            count: sliceCount[sliceIndex].values.map(r=> r.measurement)[0],
        }))
    }
})

console.log(data);

© www.soinside.com 2019 - 2024. All rights reserved.