Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中的对象数组中查找值?_Javascript_Jquery_Arrays_Search - Fatal编程技术网

如何在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');