如何在JavaScript中的对象数组中查找值?
我有一个对象数组:如何在JavaScript中的对象数组中查找值?,javascript,jquery,arrays,search,Javascript,Jquery,Arrays,Search,我有一个对象数组: Object = { 1 : { name : bob , dinner : pizza }, 2 : { name : john , dinner : sushi }, 3 : { name : larry, dinner : hummus } } 我希望能够在对象/数组中搜索键为“晚餐”的位置,并查看它是否与“寿司”匹配 我知道jQuery有$.inArray,但它似乎无法处理对象数组。也许我错了。indexOf似乎也只能在一个数组级别上工作 是否没有
Object = {
1 : { name : bob , dinner : pizza },
2 : { name : john , dinner : sushi },
3 : { name : larry, dinner : hummus }
}
我希望能够在对象/数组中搜索键为“晚餐”的位置,并查看它是否与“寿司”匹配
我知道jQuery有$.inArray,但它似乎无法处理对象数组。也许我错了。indexOf似乎也只能在一个数组级别上工作
是否没有此功能或现有代码
var getKeyByDinner = function(obj, dinner) {
var returnKey = -1;
$.each(obj, function(key, info) {
if (info.dinner == dinner) {
returnKey = key;
return false;
};
});
return returnKey;
}
只要
-1
不是有效的键。如果您有一个数组,如
var people = [
{ "name": "bob", "dinner": "pizza" },
{ "name": "john", "dinner": "sushi" },
{ "name": "larry", "dinner": "hummus" }
];
可以使用数组对象的方法:
people.filter(function (person) { return person.dinner == "sushi" });
// => [{ "name": "john", "dinner": "sushi" }]
在较新的JavaScript实现中,可以使用函数表达式:
people.filter(p => p.dinner == "sushi")
// => [{ "name": "john", "dinner": "sushi" }]
您可以使用 或者
我相信您能够将其推广到任意键和值如果你经常做这个搜索,考虑改变你的对象的格式,所以晚餐实际上是一个关键。这有点像在数据库表中分配主集群键。例如:
Obj = { 'pizza' : { 'name' : 'bob' }, 'sushi' : { 'name' : 'john' } }
您现在可以像这样轻松地访问它:Object['sushi']['name']
或者,如果对象确实如此简单(对象中只有“名称”),您可以将其更改为:
Obj = { 'pizza' : 'bob', 'sushi' : 'john' }
然后像这样访问它:Object['sushi']
显然,重构这样的数据对象显然不太可能,也不利于你,但关键在于,有时候最好的答案是考虑数据对象是否是最佳的结构。创建这样的键可以更快,创建更干净的代码。jQuery有一个内置的方法,其工作原理类似于来自的ES5
filter
函数,并且应该可以在旧浏览器上正常工作
以亚当斯为例:
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" }]
您可以使用库在数组中找到对象:
试试这个例子。您可以使用一个简单的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]);
}
}
下面的小提琴示例将包含晚餐:寿司的所有对象放入一个数组中:
这里已经有很多好的答案了,为什么不多找一个,使用lodash或下划线之类的库:)
我必须在嵌套的站点地图结构中搜索加工给定路径的第一个叶项目。我仅使用.map()
.filter()
和.reduce()就产生了以下代码。返回找到的与路径/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);
我们的大部分数据处理都使用它。它在概念上非常简单,但允许很多很酷的东西。下面是你将如何解决你的问题
//const objectScan=require('object-scan');
const findDinner=(晚餐,数据)=>objectScan(['*']{
中止:对,
rtn:'值',
filterFn:({value})=>value.dinner==晚餐
})(数据);
const data={1:{name:'bob',晚餐:'pizza'},2:{name:'john',晚餐:'sushi'},3:{name:'larry',晚餐:'hummus'};
日志(findDinner('sushi',data));
//=>{姓名:“约翰”,晚餐:“寿司”}
。作为控制台包装{最大高度:100%!重要;顶部:0}
如果您想通过搜索功能查找特定对象,请尝试以下操作:
function findArray(value){
let countLayer = dataLayer.length;
for(var x = 0 ; x < countLayer ; x++){
if(dataLayer[x].user){
let newArr = dataLayer[x].user;
let data = newArr[value];
return data;
}
}
return null;
}
findArray("id");
代码将迭代并找到“user”数组,并搜索您在其中搜索的对象
我的问题是,每次刷新窗口时,数组索引都会发生变化,它要么在第三个数组中,要么在第二个数组中,但这并不重要
对我来说工作很有魅力
在您的示例中,它稍微短一点:
function findArray(value){
let countLayer = Object.length;
for(var x = 0 ; x < countLayer ; x++){
if(Object[x].dinner === value){
return Object[x];
}
}
return null;
}
findArray('sushi');
函数findArray(值){
让countLayer=Object.length;
对于(var x=0;x
以前有人问过这个问题。您必须编写自己的函数或使用其他库。请注意,Object
在Javascript中是保留的,Object
是对象对象,即所有对象的母亲。问题和公认的答案与多维数组无关,而更多地是通过其项的属性值进行一维数组过滤。=>他们没有解决我的“在多维数组中查找值”问题。请记住,这些解决方案是ECMAScript 5的一部分,IE8不支持。虽然我更喜欢@adamse的答案,但alex的更“老掉牙的浏览器”友好。但不确定性能。@SalmanA-问题或解决方案也不是指jQuery。使用的是javascript过滤器(),而不是特定于jQuery的$.filter()——正如EasyCo所提到的,IE8中不支持过滤器函数。但是,它很容易添加到阵列原型中,因此在脚本开始时只需一个小功能就可以在任何浏览器中使用。这一点在报告中概述。它给出了ECMA-262中指定的确切函数,因此实际上是一样的。我刚刚添加了使用jQuery的grep
方法的函数。在回答中加入可能有意义,因为它的概念与您所做的相同,但依赖jQuery且对浏览器友好。我的返回变量不断出现引用错误,这有什么原因吗?我尝试了返回“x”的前两个答案,它一直说它没有定义……爱你的答案,但我发现语法有问题:我的答案是这样的:obj={“pizza”:{“name”:“bob”},“sushi”:{“name”:“john”}}alert(obj['pizza']['name']);但仍然如此。谢谢!找到了我要搜索的内容!)@alexela谢谢alexela!我用你敏锐的观察更新了我的答案!我刚刚复制了OP帖子中的示例,忽略了添加引号,但你是对的-除非值周围至少有引号(假设它们是值而不是变量),否则不会起作用。我不确定这是否真的值得否决。当需求变得比单个筛选器或reduce调用更复杂时,对集合的类似Sql的查询变得更容易推理和编写。Alasql是一个非常令人印象深刻的li
obj = {
1 : { name : 'bob' , dinner : 'pizza' },
2 : { name : 'john' , dinner : 'sushi' },
3 : { name : 'larry', dinner : 'hummus' }
}
_.where(obj, {dinner: 'pizza'})
>> [{"name":"bob","dinner":"pizza"}]
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);
function findArray(value){
let countLayer = dataLayer.length;
for(var x = 0 ; x < countLayer ; x++){
if(dataLayer[x].user){
let newArr = dataLayer[x].user;
let data = newArr[value];
return data;
}
}
return null;
}
findArray("id");
layerObj = {
0: { gtm.start :1232542, event: "gtm.js"},
1: { event: "gtm.dom", gtm.uniqueEventId: 52},
2: { visitor id: "abcdef2345"},
3: { user: { id: "29857239", verified: "Null", user_profile: "Personal", billing_subscription: "True", partners_user: "adobe"}
}
function findArray(value){
let countLayer = Object.length;
for(var x = 0 ; x < countLayer ; x++){
if(Object[x].dinner === value){
return Object[x];
}
}
return null;
}
findArray('sushi');