使用地圖和多個陣列過濾器使用維基百科的API我有一個對象,它看起來像這樣:中的對象
obj = {["string", Array[10], Array[10], Array[10]]}
第一個數組包含標題,二是描述和第三是鏈接。
一些描述可以是空的(「」)。
示例 -
我想所有的三個陣列組合成一個陣列如下:
[{title: obj[1][0], desc: obj[2][0], link: obj[3][0]}, ... , {title: array[1][9], desc: obj[2][0], link: obj[3][0]}]
但只有結合如果說明不是空 - obj[2][i] !== ""
我設法使用循環,如果做到這一點:
var arr = [];
for (var i = 0; i < data[1].length; i++) {
if (data[2][i] !== '') {
arr.push({title: data[1][i], desc:data[2][i], link: data[3][i]});
}
}
是否有使用JavaScript的高階功能更優雅的方式達到同樣的方法嗎?如map
和filter
(也許reduce
?)
感謝
編輯:
我做到了,在結束的方式是:
var resp = ["Football",
['Football', 'Soccer'],
['FootballDescription', 'SoccerDescription'],
['http://football.com', 'http://soccer.com']
];
// Mimic python's zip behavior -> assume arrays are of equal size
function zip(arrays) {
return arrays[0].map(function(_, i){
return arrays.map(function(array){
return array[i];
});
});
}
// 1. Throw away the first string, e.g. "Football"
resp.shift();
// 2. Use zip to make an array of intersected arrays, i.e
// [
// ['Football', 'FootballDescription', 'http://football.com'],
// ['Soccer', 'SoccerDescription', 'http://soccer.com']
// ]
// and then use map to make each array into a nicely named object
var objects = zip(resp).map(function(x) {
return ({ name: x[0], desc: x[1], link: x[2] });
});
console.log(objects);
/*
Output:
[ { name: 'Football',
description: 'FootballDescription',
link: 'http://football.com' },
{ name: 'Soccer',
description: 'SoccerDescription',
link: 'http://soccer.com' } ]
*/
太棒了!我將你的答案與http://stackoverflow.com/a/10284006/3237212的幫助相結合,並且收到我認爲很好看的解決方案:)查看我編輯的問題 – tamiros