code

Javascript의 다차원 객체 / 배열에서 값을 찾는 방법은 무엇입니까?

codestyles 2020. 10. 4. 11:19
반응형

Javascript의 다차원 객체 / 배열에서 값을 찾는 방법은 무엇입니까?


다차원 개체가 있습니다 (기본적으로 배열입니다).

Object = {
   1 : { name : bob , dinner : pizza },
   2 : { name : john , dinner : sushi },
   3 : { name : larry, dinner : hummus }
}

키가 "저녁 식사"인 객체 / 배열을 검색하고 "스시"와 일치하는지 확인하고 싶습니다.

jQuery에 $ .inArray가 있지만 다차원 배열에서 작동하지 않는 것 같습니다. 아니면 내가 틀렸을 수도 있습니다. indexOf는 또한 하나의 배열 수준에서만 작동하는 것 같습니다.

이에 대한 기능이나 기존 코드가 없습니까?


다음과 같은 배열이있는 경우

var people = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "larry", "dinner": "hummus" }
];

filterArray 객체 메서드를 사용할 수 있습니다 .

people.filter(function (person) { return person.dinner == "sushi" });
  // => [{ "name": "john", "dinner": "sushi" }]

최신 JavaScript 구현에서는 함수 표현식을 사용할 수 있습니다.

people.filter(p => p.dinner == "sushi")
  // => [{ "name": "john", "dinner": "sushi" }]

"dinner": "sushi"사용하는 사람을 검색 할 수 있습니다 .map

people.map(function (person) {
  if (person.dinner == "sushi") {
    return person
  } else {
    return null
  }
}); // => [null, { "name": "john", "dinner": "sushi" }, null]

또는 reduce

people.reduce(function (sushiPeople, person) {
  if (person.dinner == "sushi") {
    return sushiPeople.concat(person);
  } else {
    return sushiPeople
  }
}, []); // => [{ "name": "john", "dinner": "sushi" }]

이것을 임의의 키와 값으로 일반화 할 수 있다고 확신합니다!


jQuery에는 @ adamse 's AnswerjQuery.grep 의 ES5 filter기능 과 유사하게 작동 하는 내장 메서드 있으며 이전 브라우저에서 제대로 작동합니다.

adamse의 예를 사용하여 :

var peoples = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "larry", "dinner": "hummus" }
];

당신은 다음을 할 수 있습니다

jQuery.grep(peoples, function (person) { return person.dinner == "sushi" });
  // => [{ "name": "john", "dinner": "sushi" }]

이 검색을 자주 수행하려면 저녁 식사가 실제로 핵심이되도록 개체 형식을 변경하는 것이 좋습니다. 이것은 데이터베이스 테이블에 기본 클러스터 키를 할당하는 것과 비슷합니다. 예를 들면 다음과 같습니다.

Obj = { 'pizza' : { 'name' : 'bob' }, 'sushi' : { 'name' : 'john' } }

이제 다음과 같이 쉽게 액세스 할 수 있습니다. Object['sushi']['name']

또는 객체가 실제로 이렇게 간단하다면 (객체의 '이름'만) 다음과 같이 변경할 수 있습니다.

Obj = { 'pizza' : 'bob', 'sushi' : 'john' }

그리고 다음과 같이 액세스하십시오 Object['sushi']..

이와 같이 데이터 개체를 재구성하는 것이 항상 가능하거나 유리한 것은 아니지만, 요점은 때로는 데이터 개체가 최상의 방식으로 구조화되었는지 여부를 고려하는 것입니다. 이와 같은 키를 만드는 것이 더 빠르고 깔끔한 코드를 만들 수 있습니다.


var getKeyByDinner = function(obj, dinner) {
    var returnKey = -1;

    $.each(obj, function(key, info) {
        if (info.dinner == dinner) {
           returnKey = key;
           return false; 
        };   
    });

    return returnKey;       

}

jsFiddle .

그래서만큼 -1지금까지 유효한 키가 아닙니다.


Alasql 라이브러리를 사용 하여 배열에서 객체를 찾을 수 있습니다 .

var data = [ { name : "bob" , dinner : "pizza" }, { name : "john" , dinner : "sushi" },
     { name : "larry", dinner : "hummus" } ];

var res = alasql('SELECT * FROM ? WHERE dinner="sushi"',[data]);

jsFiddle 에서이 예제 시도하십시오 .


간단한 for in 루프를 사용할 수 있습니다.

for (prop in Obj){
    if (Obj[prop]['dinner'] === 'sushi'){

        // Do stuff with found object. E.g. put it into an array:
        arrFoo.push(Obj[prop]);
    }
}

다음 바이올린 예제는 포함하는 모든 객체를 dinner:sushi배열에 넣습니다.

https://jsfiddle.net/3asvkLn6/1/


여기에 이미 많은 좋은 답변이 있으므로 한 번 더 사용하지 않으시겠습니까? lodash 또는 underscore와 같은 라이브러리를 사용하십시오. :)

obj = {
   1 : { name : 'bob' , dinner : 'pizza' },
   2 : { name : 'john' , dinner : 'sushi' },
   3 : { name : 'larry', dinner : 'hummus' }
}

_.where(obj, {dinner: 'pizza'})
>> [{"name":"bob","dinner":"pizza"}]

I had to search a nested sitemap structure for the first leaf item that machtes a given path. I came up with the following code just using .map() .filter() and .reduce. Returns the last item found that matches the path /c.

var sitemap = {
  nodes: [
    {
      items: [{ path: "/a" }, { path: "/b" }]
    },
    {
      items: [{ path: "/c" }, { path: "/d" }]
    },
    {
      items: [{ path: "/c" }, { path: "/d" }]
    }
  ]
};

const item = sitemap.nodes
  .map(n => n.items.filter(i => i.path === "/c"))
  .reduce((last, now) => last.concat(now))
  .reduce((last, now) => now);

Edit 4n4904z07


I would try not to reinvent the wheel. We use object-scan for all our data processing needs. It's conceptually very simple, but allows for a lot of cool stuff. Here is how you would solve your specific question

Data Definition

const data = {
   1 : { name : 'bob' , dinner : 'pizza' },
   2 : { name : 'john' , dinner : 'sushi' },
   3 : { name : 'larry', dinner : 'hummus' }
};

Logic

const objectScan = require('object-scan');

const scanner = (input) => {
  let obj = null;
  objectScan(['*.dinner'], {
    filterFn: (key, value, { parents }) => {
      if (value === 'sushi') {
        obj = parents[0];
      }
    },
    breakFn: () => obj !== null
  })(data);
  return obj;
};

const result = scanner(data);

Output

// => result
{
  "name": "john",
  "dinner": "sushi"
}

참고URL : https://stackoverflow.com/questions/5181493/how-to-find-a-value-in-a-multidimensional-object-array-in-javascript

반응형