Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.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_Node.js - Fatal编程技术网

Javascript 如何高效地构建此阵列?

Javascript 如何高效地构建此阵列?,javascript,arrays,node.js,Javascript,Arrays,Node.js,我有一个对象数组,例如: [ { a: 3, b: 2, c: 5, d: 6, e: 8 }, { a: 1, b: 5, c: 3, d: 1, e: 2 } ] 现在我想将其转换为一个数组,该数组只包含特定属性的值,而不包含对象本身。例如,如果我对a、b、c和d感兴趣,结果应该如下所示: [ 3, 2, 5, 6, 1, 5, 3, 1 ] const result = _.flatten(data.map(item => [ item.a, item.b, item.c

我有一个对象数组,例如:

[
  { a: 3, b: 2, c: 5, d: 6, e: 8 },
  { a: 1, b: 5, c: 3, d: 1, e: 2 }
]
现在我想将其转换为一个数组,该数组只包含特定属性的值,而不包含对象本身。例如,如果我对
a
b
c
d
感兴趣,结果应该如下所示:

[ 3, 2, 5, 6, 1, 5, 3, 1 ]
const result = _.flatten(data.map(item => [ item.a, item.b, item.c, item.d ]));
我目前的做法如下:

[ 3, 2, 5, 6, 1, 5, 3, 1 ]
const result = _.flatten(data.map(item => [ item.a, item.b, item.c, item.d ]));

有没有更好的方法(例如,更有效,甚至更易读)来获得结果?

我觉得你的内容非常易读,而且可能足够有效。但您可以通过避免所有这些临时数组和不循环两次来提高效率:

const result = [];
data.forEach(item => result.push(item.a, item.b, item.c, item.d));
例如:

const数据=[
{a:3,b:2,c:5,d:6,e:8},
{a:1,b:5,c:3,d:1,e:2}
];
常量结果=[];
forEach(item=>result.push(item.a、item.b、item.c、item.d));

控制台日志(结果)您可以使用映射键来减少

var数组=[{a:3,b:2,c:5,d:6,e:8},{a:1,b:5,c:3,d:1,e:2}],
键=['a','b','c','d'],
result=array.reduce((r,a)=>r.concat(keys.map(k=>a[k]),[]);
控制台日志(结果)您可以从数组中的对象中选择所需的键,并将所有键与和合并:

let data=[{a:3,b:2,c:5,d:6,e:8},{a:1,b:5,c:3,d:1,e:2}],
结果=[].concat.apply([],data.map(i=>[i.a,i.b,i.c,i.d]);

控制台日志(结果),并且不要求效率,您可以编写

const输入=[
{a:3,b:2,c:5,d:6,e:8},
{a:1,b:5,c:3,d:1,e:2}
];

console.log([].concat(…input.map({a,b,c,d})=>[a,b,c,d])您可以使用2个嵌套的forEach循环来推送输入数组中每个元素的目标值。我在这里提出了一个函数,它接收作为参数的初始数组和作为其他数组的属性:

var充气=(数据、选项)=>{
var结果=[];
data.forEach(x=>options.forEach(y=>results.push(x[y]));
返回结果;
}

日志(充气({a:3,b:2,c:5,d:6,e:8},{a:1,b:5,c:3,d:1,e:2}),“a”,“b”,“c”,“d”])恕我直言,这不仅效率低,而且可读性差。:-)但它更灵活,是的。我只是记下问题的最后一行。但更灵活可能会“更好”,只是他提到的“更好”的例子中没有一个与其使用
reduce
不如编写
[].concat(…array.map(o=>keys.map(k=>o[k]))
。虽然这是迄今为止IMHO最可读的版本,但它的主要缺点是concat会一次又一次地创建新数组。或者我遗漏了什么?你想/需要使用lodash/下划线吗?您感兴趣的财产名称列表是静态的还是动态的?@torazaburo:确实是。昨天下午,当我离开电脑时,我想到了这一点。:-)现在完成。