-1

給出一個包含有許多對象,所有包含數組一個JS數組:如何從JSON中返回嵌套在對象中的嵌套JavaScript數組的屬性值?

var data = [ 
    {id: 1, name: "Fred", pages:[{url:"www.abc.com", title: "abc"}]}, 
    {id: 2, name: "Wilma", pages:[{url:"www.123.com", title: "123"}]}, 
    {id: 3, name: "Pebbles", pages:[{url:"www.xyz.com", title: "xyz"}]} 
]; 

如何有效地提取最內部陣列(頁)值到一個數組?

var dataArray = [ 
    {url: "www.abc.com", title: "abc"}, 
    {url: "www.123.com", title: "123"}, 
    {url: "www.xyz.com", title: "xyz"} 
    ] 
+0

使用陣列'圖()'方法。檢查我的答案。 –

+0

「高效」是什麼意思?你在哪裏堅持下去?如何循環訪問數據,你有問題嗎?如何從'data'中的每個元素中檢索/訪問'pages'屬性有問題嗎?如何從'pages'中的每個元素中檢索/訪問第一個元素,是否存在問題? – 2016-11-28 06:48:40

+0

「頁面」可以有多個元素,如果是的話,你想要所有的結果,還是隻有第一個? – 2016-11-28 06:52:34

回答

2

做到這一點的最簡單的方法是使用Array#map像這樣:

var dataArray = data.map(function(o){return o.pages}); 

如果pages是對象的數組(不是一個單一的對象)時,這將導致一個數組的數組,您將需要使用Array#reduce拉平例如:

dataArray = dataArray.reduce(function(a,b){return a.concat(b)}, []); 
+0

你可以將'var dataArray = data.map(function(o){return o.pages})這兩個操作結合起來。 ' –

+0

我認爲你的'reduce'是'[] .concat(... dataArray)''的一個羅嗦版本。 – 2016-11-28 06:51:22

+0

@torazaburo肯定這是另一種方式來做到這一點,但使用ES6的'...',ES5等同於:'Array.prototype.concat。應用([],dataArray)' – dtkaias

1

下面是關於如何實現工作例如,你想要什麼:

var data = [ 
    {id: 1, name: "Fred", pages:[{url:"www.abc.com", title: "abc"}, {url:"www.google.com", title: "Google"}]}, 
    {id: 2, name: "Wilma", pages:[{url:"www.123.com", title: "123"}]}, 
    {id: 3, name: "Pebbles", pages:[{url:"www.xyz.com", title: "xyz"}]} 
]; 

var arr = Array(); 
var arr2 = Array(); 

// You can either iterate it like this: 
for (var i = 0; i < data.length; i++) { 
    // If you only want the first page in your result, do: 
    // arr.push(data[i].pages[0]); 

    // If you want all pages in your result, you can iterate the pages too: 
    for (var a = 0; a < data[i].pages.length; a++) { 
    arr.push(data[i].pages[a]); 
    } 
} 

// Or use the array map method as suggested dtkaias 
// (careful: will only work on arrays, not objects!) 
//arr2 = data.map(function (o) { return o.pages[0]; }); 

// Or, for all pages in the array: 
arr2 = [].concat(...data.map(function (o) { return o.pages; })); 

console.log(arr); 
console.log(arr2); 
// Returns 2x [Object { url="www.abc.com", title="abc"}, Object { url="www.123.com", title="123"}, Object { url="www.xyz.com", title="xyz"}] 
+0

但它仍然是錯誤的,如果頁面中會有幾個頁面對象鍵? – stasovlas

+0

這不是問題。問題是它如何與給定的數組結構專門協同工作。如果有多個密鑰,我們首先需要更多關於如何鏈接的信息,對嗎? –

+1

輸入中的'pages'屬性在示例中不包含多個對象,但它是帶有「s」的「頁面」,並且它是一個數組,所以認爲有時會有多個對象網頁:[{url:「www.abc.com」,title:「abc」},{url:「www.def.com」,title:「def」},{url: 「www.ghi.com」,標題:「ghi」}]' – nnnnnn

0

使用數組map() & reduce()方法:

var data = [ 
 
    {id: 1, name: "Fred", pages:[{url:"www.abc.com", title: "abc"}]}, 
 
    {id: 2, name: "Wilma", pages:[{url:"www.123.com", title: "123"}]}, 
 
    {id: 3, name: "Pebbles", pages:[{url:"www.xyz.com", title: "xyz"}]} 
 
]; 
 
    
 
var dataArray = data.map(function(item) { 
 
    return item.pages; 
 
});  
 

 
dataArray = dataArray.reduce(function(a,b) { 
 
    return a.concat(b); 
 
}, []); 
 

 
console.log(dataArray);

+0

是的,但只有當OP只想要每個「頁面」數組中的第一個元素時 - 我們必須讓她告訴我們是否屬於這種情況。 – 2016-11-28 07:01:02

+0

@torazaburo感謝您糾正我。我更新了我的答案。 –

1

如果 「有效」 你實際上意味着 「簡潔」,然後

[].concat(...data.map(elt => elt.pages)) 

data.map將產生一個數組pages。然後[].concat(...將所有pages數組作爲參數傳遞給concat,這將將其所有元素組合到一個數組中。

如果您在ES5編程,相當於將

Array.prototype.concat.apply([], data.map(function(elt) { return elt.pages; })) 
2

你正在尋找一個flatMap

var data = [ 
 
    {id: 1, name: "Fred", pages:[{url:"www.abc.com", title: "abc"}]}, 
 
    {id: 2, name: "Wilma", pages:[{url:"www.123.com", title: "123"}]}, 
 
    {id: 3, name: "Pebbles", pages:[{url:"www.xyz.com", title: "xyz"}]} 
 
]; 
 

 
const concat = (xs, ys) => xs.concat(ys); 
 

 
const prop = x => y => y[x]; 
 

 
const flatMap = (f, xs) => xs.map(f).reduce(concat, []); 
 

 
console.log(
 
    flatMap(prop('pages'), data) 
 
);

+0

除了丟失的分號以外,還是很不錯的。 – 2016-11-28 11:59:32

+0

不錯!謝謝! – Veronica