我有一个多维对象(它基本上是一个数组):
Object = {
1 : { name : bob , dinner : pizza },
2 : { name : john , dinner : sushi },
3 : { name : larry, dinner : hummus }
}
我希望能够在对象/数组中搜索关键字“吃饭”的位置,并查看它是否与“寿司”匹配。
我知道jQuery有$ .inArray,但它似乎不适用于多维数组。或者也许我错了。 indexOf似乎也只能在一个数组级别上工作。
这个没有功能或现有代码吗?
答案 0 :(得分:181)
如果你有一个像
这样的数组var people = [
{ "name": "bob", "dinner": "pizza" },
{ "name": "john", "dinner": "sushi" },
{ "name": "larry", "dinner": "hummus" }
];
您可以使用Array对象的filter
方法:
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]
people.reduce(function (sushiPeople, person) {
if (person.dinner == "sushi") {
return sushiPeople.concat(person);
} else {
return sushiPeople
}
}, []); // => [{ "name": "john", "dinner": "sushi" }]
我确信你能够将其概括为任意键和值!
答案 1 :(得分:17)
jQuery有一个内置方法jQuery.grep
,它与@adamse's Answer中的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" }]
答案 2 :(得分:10)
如果您要经常进行此搜索,请考虑更改对象的格式,以便晚餐实际上是关键。这有点像在数据库表中分配主群集密钥。所以,例如:
Obj = { 'pizza' : { 'name' : 'bob' }, 'sushi' : { 'name' : 'john' } }
您现在可以轻松地访问它:Object['sushi']['name']
或者如果对象真的很简单(只是对象中的'name'),你可以将它改为:
Obj = { 'pizza' : 'bob', 'sushi' : 'john' }
然后访问它:Object['sushi']
。
显然并非总是有可能或者有利于重构这样的数据对象,但重点是,有时最好的答案是考虑数据对象是否以最佳方式构建。创建这样的密钥可以更快,并创建更清晰的代码。
答案 3 :(得分:8)
var getKeyByDinner = function(obj, dinner) {
var returnKey = -1;
$.each(obj, function(key, info) {
if (info.dinner == dinner) {
returnKey = key;
return false;
};
});
return returnKey;
}
只要-1
不是有效密钥。
答案 4 :(得分:2)
您可以使用Alasql库找到数组中的对象:
var data = [ { name : "bob" , dinner : "pizza" }, { name : "john" , dinner : "sushi" },
{ name : "larry", dinner : "hummus" } ];
var res = alasql('SELECT * FROM ? WHERE dinner="sushi"',[data]);
试试这个例子in jsFiddle。
答案 5 :(得分:1)
您可以使用简单的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
的所有对象放入数组中:
答案 6 :(得分:1)
这里已经有很多好的答案,所以为什么不再使用lodash或下划线这样的库?)
obj = {
1 : { name : 'bob' , dinner : 'pizza' },
2 : { name : 'john' , dinner : 'sushi' },
3 : { name : 'larry', dinner : 'hummus' }
}
_.where(obj, {dinner: 'pizza'})
>> [{"name":"bob","dinner":"pizza"}]
答案 7 :(得分:0)
我必须在嵌套的站点地图结构中搜索适合给定路径的第一个叶项。我仅使用.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);
答案 8 :(得分:0)
我会尽量不要重新发明轮子。我们将object-scan用于所有数据处理需求。从概念上讲,它很简单,但是可以容纳很多很酷的东西。这是解决特定问题的方法
powershell -Command "$varStr='store:Schema=""abcd""""'; $filePath='%~dp0SomeFolder\SomeFile.txt'; (gc $filePath) -replace $varStr, '' | Out-File $filePath"
const data = {
1 : { name : 'bob' , dinner : 'pizza' },
2 : { name : 'john' , dinner : 'sushi' },
3 : { name : 'larry', dinner : 'hummus' }
};
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);
答案 9 :(得分: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");
这是一个示例对象:
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');