组合一个对象的所有 forEach

combine all forEach of an object

我有一个对象如下

data = {
  Sam: { details: [ /* array items */ ] },
  Jill: { details: [ /* array items */ ] },
  Bill: { details: [ /* array items */ ] },
}

然后我有下面的代码根据名称过滤数据

filteredData = {};

Object.keys(data).forEach((name) => {
  filteredData[name] = data[name];
});

我在下面的构造函数中调用它来获取特定名称的 details

vis.dataFilteredTemp = filteredData[vis.name];
vis.dataFiltered = vis.dataFilteredTemp["details"];

如果 vis.nameJill,那么输出是 {details: Array(3)} & 这工作得很好。

现在,我想要使用 is filteredData 方法的所有名称的详细信息。我该怎么做? 如果我做 vis.dataFilteredTemp = filteredData[](传递空数组),预期的输出是 {details: Array(13)}}。 13个数组,因为所有名字的数组都加起来了。

因为我正在使用 d3.csv,所以我无法将 data 直接传递给构造函数。有人可以帮忙吗?

迭代 Object.values, and use flatMap 以合并每个数组的 details

const data = {
  Sam: { details: [1,2,3,4]},
  Jill: { details: [4,5,6] },
  Bill: { details: [7,8,9,10,11,12] }
};

function getData(data, name = '') {
  if (name) return { details: data[name].details };
  return { details: Object.values(data).flatMap(arr => arr.details) };
}

console.log(getData(data));
console.log(getData(data, 'Jill'));

如果我理解的很好,你应该使用Array.reduce

const data = {
  Sam: { details: [1,2] },
  jenn: { details: [3,4] },
  kurt: { details: [6, 9 , 10, 16] }
};

const result = Object.values(data).reduce((acc = {details: []}, val) => {
  acc.details.push(...val.details);
  return acc;
});

console.log(result.details);

输出:[1, 2, 3, 4, 6, 9, 10, 16]

fiddle