我想获得每个对象的值数组。
我有这个:
const numDataPoints = [
{
x0: {x: 807, y: 625},
x1: {x: 15, y: 20},
x2: {x: 5, y: 20}
},
{
x0: {x: 11, y: 6},
x1: {x: 16, y: 21},
x2: {x: 7, y: 22}
}
];
我想要这个:
[
[807, 625],
[15, 20],
[5, 20],
[11, 6],
[16, 21],
[7, 22]
]
我试过了:
numDataPoints.map((array) => array.map(axis => [axis.x, axis.y]));
但它会抛出此错误:
未被捕捉
TypeError
:array.map
不是函数
答案 0 :(得分:7)
您可以将map
方法与Object.values
一起使用并传播语法...
。
const data = [{ x0: {x: 807, y: 625}, x1: {x: 15, y: 20}, x2: {x: 5, y: 20} }, { x0: {x: 11, y: 6}, x1: {x: 16, y: 21}, x2: {x:7, y: 22} }];
const result = [].concat(...data.map(Object.values)).map(Object.values)
console.log(result)

答案 1 :(得分:5)
您可以使用Array.map
将每个对象转换为双元素数组的数组,然后缩小以展平结果:
const numDataPoints = [{ x0: {x: 807, y: 625}, x1: {x: 15, y: 20},
x2: {x: 5, y: 20} }, { x0: {x: 11, y: 6}, x1: {x: 16, y: 21}, x2: {x:7, y: 22} }];
let result = numDataPoints.map(
item => Object.values(item).map(({x, y})=> [x, y]))
.reduce((arr, current) => [...arr, ...current], []);
console.log(result);

答案 2 :(得分:4)
使用reduce也是如此 - 以下内容也适用于其他数据,因为我们不会在此处对任何密钥的名称进行硬编码。
const res = numDataPoints.reduce((a, b) => a.concat(Object.keys(b).map(e => Object.values(b[e]))), []);
console.log(res);

<script>
const numDataPoints = [
{
x0: {
x: 807,
y: 625
},
x1: {
x: 15,
y: 20
},
x2: {
x: 5,
y: 20
}
}, {
x0: {
x: 11,
y: 6
},
x1: {
x: 16,
y: 21
},
x2: {
x: 7,
y: 22
}
}
];
</script>
&#13;
答案 3 :(得分:1)
您的numDataPoints
数组中没有数组,而是常规对象,因此您无法使用map
。
您需要的是Object.values
。或者,要保证密钥x0
,x1
和x2
,destructure与{x0, x1, x2}
的顺序相同,然后使用{ {1}}。
[x0, x1, x2]
的结构表明,您实际上需要一组两个数组,每个数组都有三个 numDataPoints
点,而不仅仅是六点[x, y]
点。如果您仍想展平这些子阵列,请使用concat
或flatMap
(目前是第3阶段候选人,可能成为2019年6月完成的ECMAScript版本的一部分)。
以下是所有六种可能性:
[x, y]
答案 4 :(得分:0)
您可以使用Object.keys
迭代对象中的键,如下所示:
let data = [{
x0: {
x: 807,
y: 625
},
x1: {
x: 15,
y: 20
},
x2: {
x: 5,
y: 20
}
}, {
x0: {
x: 11,
y: 6
},
x1: {
x: 16,
y: 21
},
x2: {
x: 7,
y: 22
}
}];
let result = data.map(obj => Object.keys(obj).map((key) => [obj[key].x, obj[key].y]));
console.log(result);
&#13;
你可能想要缩小结果,我不确定。
答案 5 :(得分:0)
这是因为你得到的是一个对象,而不是一个数组。虽然你可以尝试(Es6):
numDataPoints
.map(_ => {
return Object.values(_)
.map(({x, y}) => [x, y]);
}).reduce((acc, elem) => [...acc, ...elem], []);
答案 6 :(得分:0)
问题是array
是一个对象,因此您必须在使用另一个forEach
之前映射密钥。
const numDataPoints = [{ x0: {x: 807, y: 625}, x1: {x: 15, y: 20},x2: {x: 5, y: 20} }, { x0: {x: 11, y: 6}, x1: {x: 16, y: 21}, x2: {x:7, y: 22} }];
var foo = []
numDataPoints.forEach((points) =>
Object.keys(points).forEach(point =>
foo.push( [points[point].x, points[point].y] )
)
);
console.log(foo)
答案 7 :(得分:0)
以下是获得两种不同结果的几种不同方法(原始嵌套结构或平面结构) - 另请注意可能是用例的排序 - 字典键按照声明的方式排序(不是字母数字) ):
DataGrid