[英]How to extract parts of nested multi-level JSON objects / array and flatten it with JavaScript
[英]Flatten multi-level/nested array in javascript
我正在嘗試了解此代碼段如何使多級/嵌套數組扁平化
有人可以幫忙詳細說明嗎? 謝謝
var flatten = function(a, shallow,r){
if(!r){ r = []} //what does the exclamation mark mean here?...
if (shallow) {
return r.concat.apply(r,a); //I can't find what's .apply for concat method
}
for(var i=0; i<a.length; i++){
if(a[i].constructor == Array){
flatten(a[i],shallow,r);
}else{
r.push(a[i]);
}
}
return r;
}
alert(flatten([1, [2], [3, [[4]]],[5,6]]));
有趣的是,在示例中未達到代碼的較淺部分。
更新
我認為該功能很難遵循。 這是一個可能更容易閱讀的替代方法。
function flatten(arr) {
var flatArray = [];
function pushLoop(a) {
var len = a.length;
var i=0;
for (i; i < len; i++) {
if (a[i] && a[i].constructor == Array) {
pushLoop(a[i]);
} else {
flatArray.push(a[i]);
}
}
}
pushLoop(arr);
return flatArray;
}
原始片段
var flatten = function(a, shallow, r) { // if r does not exist create. if (!r) { r = [] } // if shallow exists concat the arrays if (shallow) { // concat joins two or more arrays as paramenters. // The prototype apply allows us to define the parameters // as an array. Esentially concat the arrays in array a. return r.concat.apply(r, a); } for (var i = 0; i < a.length; i++) { // Only flatten items that are arrays and push everything // else to the end. if (a[i].constructor == Array) { flatten(a[i], shallow, r); } else { r.push(a[i]); } } return r; } var output = document.getElementById("output"); var arr = (flatten([1, [2], [3, [ [4] ]], [5, 6] ])); output.innerHTML = JSON.stringify(arr);
<div id="output"></div>
!r
是“ Not r”中的否定詞。 這意味着如果r = false,r = null或r = undefined,則if狀態的含義為true。
.apply()
是javascript中所有函數的成員。 它允許您使用與其所在的函數不同的“ this”作用域來調用該函數。簽出該代碼: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function /應用
行返回r.concat.apply(r,a)具有誤導性。
他們也可以使用[] .concat.apply(r,a)。 “ apply”是在每個類型為“ function”(typeof o ===“ function”,基本上是任何可調用對象)的對象上定義的方法,該方法以“ this”綁定到第一個參數和傳遞的數組中的參數來執行功能作為第二個論點。
假設我們有一個函數“ f”。
function f(a,b,c) {
this.x = a + b + c;
}
這兩個代碼塊都在f = = objInstance的地方調用f,在兩個塊都運行之后,objInstance.x = 6。
var Obj = function() {};
Obj.prototype.f = f;
var objInstance = new Obj();
objInstance.f(1,2,3);
var Obj = function () {};
var objInstance = new Obj();
f.apply(objInstance, [1,2,3]);
因此[] .concat.apply(r,a)等同於在對象r上應用了參數a的[] .concat。 它將a中的每個數組連接到數組r。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.