2017-12-08 2 views
0

인덱스를 다차원 배열로 가져 오는 데 문제가 있습니다. 사용자가 관찰 할 수있는 바와 같이다차원 배열의 indexOf를 얻는 방법은 무엇입니까?

var z = [["231f20", 5385], ["ffffff", 2419], ["ffafff", 2419]]; 
var index = z[0].indexOf('ffffff'); 
alert(index); #returns -1 

, 16 진수 값 및 번호 (픽셀 량) z 동일한리스트 안에있다.

올바른 목록의 색인을 필터링하고 가져올 수있는 방법은 무엇입니까?

+0

어떤 색인을 원하십니까? 1? (1, 0)? –

+1

내부 배열의 내용을 검색하려면 배열을 병합하거나 재귀 적 메서드를 사용해야합니다. – 31piy

+1

''ffffff ''는 어떤 경우에도'z [0]'에 없습니다. –

답변

5

올바른 목록의 색인을 필터링하고 가져올 수있는 방법은 무엇입니까?

당신 사용 filter,하지만 난 않을 것;

var z = [["231f20", 5385], ["ffffff", 2419], ["ffafff", 2419]]; 
 
var index = z.findIndex(function(entry) { 
 
    return entry.indexOf("ffffff") != -1; 
 
}); 
 
console.log(index);

findIndex 콜백이 truthy 값을 반환하는 첫 번째 항목의 인덱스를 반환 : 나는 findIndex * 사용하는 것입니다.

그냥 외부 인덱스 (1)를 알려줍니다. 당신이 모두 인덱스를 원한다면, 나는 아마 가까운 결과 변수를 통해 ** some를 사용하여 콜백이있을 것이다 :

var z = [["231f20", 5385], ["ffffff", 2419], ["ffafff", 2419]]; 
 
var outerIndex, innerIndex; 
 
var index = z.some(function(entry, index) { 
 
    var n = entry.indexOf("ffffff"); 
 
    if (n != -1) { 
 
    outerIndex = index; 
 
    innerIndex = n; 
 
    return true; 
 
    } 
 
}); 
 
console.log(outerIndex, innerIndex);


* findIndex는 ES2015에 추가 되었으나, 그것은 polyfill하는 것이 사소한 일이다; polyfill에 대한 링크 된 MDN 기사를 참조하십시오.

** some은 2009 년 ES5에서 나왔으므로 IE8과 같은 진정으로 쓸모없는 브라우저가 아닌 모든 것이 될 것입니다. 또한 polyfillable.

Object.prototype.deepIndexOf = Array.prototype.deepIndexOf = function (v) { 
    for (var i in this) { 
     if (this[i] === v) { 
      return [i]; 
     } 

     if ('object' === typeof this[i]) { 
      var t = this[i].deepIndexOf(v); 
      if (t !== undefined) { 
       t.unshift(i); 
       return t; 
      } 
     } 
    } 
    return undefined; 
} 

을이 아마 어떤 경우에는 실패하지만, 간단한 배열과 객체에 대해 작동합니다 :

나는 인덱스의 배열 따라 반환하는 신속하고 더러운 깊은 같이 IndexOf 기능을 작성했습니다

0

Object.prototype.deepIndexOf = Array.prototype.deepIndexOf = function(v) { 
 
\t for(var i in this) { 
 
    \t if(this[i] === v) { 
 
    \t return [i]; 
 
    } 
 

 
    if('object' === typeof this[i]) { 
 
    \t var t = this[i].deepIndexOf(v); 
 
     if(t !== undefined) { 
 
     \t t.unshift(i); 
 
     \t return t; 
 
     } 
 
    } 
 
    } 
 
    return undefined; 
 
} 
 

 
var z = [["231f20", 5385], ["ffffff", 2419], ["ffafff", 2419]]; 
 

 
var z2 = { 
 
\t hello: { 
 
    \t world: 5 
 
    }, 
 
    bye: { 
 
    \t world: 3, 
 
    earth: 4 
 
    } 
 
} 
 

 
console.log(z.deepIndexOf('ffffff')); 
 
console.log(z2.deepIndexOf(4)); 
 

 
// And even very deep objects/arrays: 
 

 
var verydeep = { 
 
    one: { 
 
     two: [ 
 
      [ 
 
       { 
 
        five: { 
 
         six: [ 
 
          'Hello' 
 
         ] 
 
        } 
 
       } 
 
      ] 
 
     ] 
 
    } 
 
} 
 

 
console.log(verydeep.deepIndexOf('Hello'))

출력 :

[ 
    "1", 
    "0" 
] 
[ 
    "bye", 
    "earth" 
] 
[ 
    "one", 
    "two", 
    "0", 
    "0", 
    "five", 
    "six", 
    "0" 
] 
+0

멋지지만 ** 결코 ** Object.prototype' 또는'Array.prototype'에 열거 가능한 속성을 추가하지 마십시오. ('Object.prototype'에 * anything *을 추가하는 것은 아마도 열거되지 않는 경우 일지라도 나쁜 생각입니다.) 대신에 Object.defineProperty를 사용하여 비 - 열거 형을 추가하십시오. –

관련 문제