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" }
];
filter
Array 객체 의 메서드를 사용할 수 있습니다 .
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]);
간단한 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);
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"
}
'code' 카테고리의 다른 글
개발 모드에서 설치된 Python 모듈 제거 (0) | 2020.10.04 |
---|---|
루비 : :: 접두사는 무엇을합니까? (0) | 2020.10.04 |
Elixir 문자열을 정수 또는 부동 소수점으로 변환 (0) | 2020.10.04 |
C #에서 XML을 다루는 방법 (0) | 2020.10.04 |
Perl에서 문자열을 숫자로 어떻게 변환 할 수 있습니까? (0) | 2020.10.04 |