簡體   English   中英

三維數組如何在JavaScript中使用“每個”函數

[英]How a three-dimensional array use 'every' function in javascript

三維數組如何使用every函數,結果很奇怪:

var foo = [];
foo[0] = [];
foo[1] = [];
foo[0][0] = [];
foo[0][1] = [];
foo[1][0] = [];
foo[1][1] = [];
foo[0][0][0] = "kanon";
foo[0][0][1] = "JOJO";
foo[0][1][0] = "Dio";
foo[0][1][1] = "Sort";
foo[1][0][0] = "What";
foo[1][0][1] = "Gary";
foo[1][1][0] = "Tofu";
foo[1][1][1] = "bili";
var foo2 = ["JOJO","JOJO","mon","ti","JOJO"];
function isJOJO(x){
    if(x === "JOJO"){
        document.write(x + " is JOJO. <br>");
        return true;
    }else{
        document.write(x + " is not JOJO. <br>");
        return false;
    }
}
document.write(foo.every(isJOJO));
document.write("<br><br>");
document.write(foo2.every(isJOJO));

Chrome中的結果如下:

kanon,JOJO,Dioo,Sort is not JOJO. 
false

JOJO is JOJO. 
JOJO is JOJO. 
mon is not JOJO. 
false

一維數組foo2的結果是正確的,但三維數組的結果不是...

我定義三維數組foo的方式是否錯誤?

為什么只排序直到Sort ,甚至打印kanonDioo ,這不是===“ JOJO”

或者誰可以向我推薦另一本官方書籍或網站,我現在正在使用這本書,該書由Stoyan Stefanov和Kumar Chetan Sharma授權編寫

非常感謝。 ^ w ^

Javascript沒有真正的多維數組,所有數組都是一維的。 但是,數組的元素可以是任何類型,創建的數組是其元素為其他數組的那些數組,這些數組也具有數組作為元素。

但是像Array.prototype.every這樣的數組函數每一個都只考慮給定的頂級數組,而不會遞歸到所包含的數組中。 因此,當您嘗試:

foo.every(isJOJO)

它呼吁

isJOJO(foo[0])

相當於

isJOJO([["kanon","JOJO"],["Dioo","Sort"]])

這不等於"JOJO" ,因此它返回false ,並導致every()返回false

這兩個陣列實際上都是一維的。 實際上,所有編程語言中的所有數組都是一維的。 額外的維度只是人類對一維數組包含的內容的解釋。

foo是一個普通(一維)數組,碰巧包含一個包含數組的數組。 讓我們重寫您的代碼以使其顯而易見:

var foo = [];
foo[0] = [['kanon','JOJO'],['Dioo','Sort']];
foo[1] = [['What','Gary'],['Tofu',bili']];

現在,很明顯foo僅包含兩個成員。 碰巧那些成員是數組。

因此foo.every()將遍歷foo[0]foo[1] 如果您需要遍歷foo的內容,則需要像對foo[0].every()一樣對它們調用.every()

您可能要三維地找到

var firstJOJO=foo.find(arr=>arr.find(inner=>inner.find(isJOJO)));

正如其他答案所描述的那樣, foo的頂級元素是數組,因此,如果要查看它們中的值,可以使用遞歸:

 var foo = []; foo[0] = []; foo[1] = []; foo[0][0] = []; foo[0][1] = []; foo[1][0] = []; foo[1][1] = []; foo[0][0][0] = "kanon"; foo[0][0][1] = "JOJO"; foo[0][1][0] = "Dio"; foo[0][1][1] = "Sort"; foo[1][0][0] = "What"; foo[1][0][1] = "Gary"; foo[1][1][0] = "Tofu"; foo[1][1][1] = "bili"; var foo2 = ["JOJO","JOJO","mon","ti","JOJO"]; function isJOJO(x){ if(Array.isArray(x)){ return x.every(isJOJO); }else if(x === "JOJO"){ console.log(x + " is JOJO."); return true; }else{ console.log(x + " is not JOJO."); return false; } } console.log(foo.every(isJOJO)); console.log(foo2.every(isJOJO)); 

Javascript本身並不做多維數組。 它將數組的數組進行到第n次。 因此,在您的情況下,您的foo是一個數組數組,每個子數組都是一個數組數組。

因此,在調用foo.every(isJOJO)時傳遞給isJOJO函數的值是一個數組數組。 這就是為什么它與“ JOJO”不同的原因。

您將要測試傳遞給函數的值是否是數組,如果要運行,請運行:x.every(isJOJO)。

Barmar發布答案清楚地解釋了為什么代碼不起作用。 從那里開始。

要遞歸地在多維數組中查找元素,可以編寫deepEvery函數:

function deepEvery(array, condition) {
  const results = []

  for (let item of array) {
    if (Array.isArray(item)) {
      // Handle internal arrays with a recursive call:
      for (let subitem of deepEvery(item, condition)) results.push(subitem)

    } else {
      // Handle single items by testing the condition:
      if (condition(item)) results.push(item)
    }
  }

  return results
}

例如:

const array = [
  [
    ["foo", "bar"]
  ],
  [ "foo" ],
  "foo"
]

console.log(deepEvery(array, x => x === 'foo'))
# ['foo', 'foo', 'foo']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM