Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Loops_Object_Properties - Fatal编程技术网

Javascript 从匹配数组的嵌套数组中获取名称

Javascript 从匹配数组的嵌套数组中获取名称,javascript,arrays,loops,object,properties,Javascript,Arrays,Loops,Object,Properties,我有一些数组,如果它们包含类似的值,我想返回这些数组的名称 var x = { "food": ['bacon', 'cheese', 'bread', 'tomato'], "utilities": ['plates', 'forks', 'spatulas'], "guests": ['john', 'matt', 'bill'] }, y = ['bacon', 'tomato', 'forks']; 通过这个函数抛出它们时,我得到一个错

我有一些数组,如果它们包含类似的值,我想返回这些数组的名称

var x = { "food": ['bacon', 'cheese', 'bread', 'tomato'], "utilities": ['plates', 'forks', 'spatulas'], "guests": ['john', 'matt', 'bill'] }, y = ['bacon', 'tomato', 'forks']; 通过这个函数抛出它们时,我得到一个错误
*********
。如何获取返回的
[“食物”、“实用程序”]

对象上执行一个简单的
reduce()
。键将完成此任务

var x={
“食物”:[‘培根’、‘奶酪’、‘面包’、‘西红柿’],
“实用工具”:[‘盘子’、‘叉子’、‘抹刀’],
“客人”:[“约翰”、“马特”、“比尔”]
},
y=[‘培根’、‘西红柿’、‘叉子’];
设res=Object.keys(x).reduce((a,b)=>{
如果(x[b]。一些(v=>y.includes(v)))a.push(b);
返回a;
}, []);
控制台日志(res)
您可以使用
y
数组的映射来创建数组,以及

var x={
“食物”:[‘培根’、‘奶酪’、‘面包’、‘西红柿’],
“实用工具”:[‘盘子’、‘叉子’、‘抹刀’],
“客人”:[“约翰”、“马特”、“比尔”]
};
变量y=[‘培根’、‘西红柿’、‘叉子’];
var yMap=y.reduce(函数(o,v){//创建一个映射以保存每次比较时y的迭代
o[v]=真;
返回o;
}, {});
var result=Object.keys(x).filter(函数(键){//筛选键
返回x[key].some(函数(v){//如果映射中至少有一个数组项,则保留该键
返回yMap[v];
});
});

控制台日志(结果)您可以使用
Object.keys()的方法执行此操作:

演示:

var x={
“食物”:[‘培根’、‘奶酪’、‘面包’、‘西红柿’],
“实用工具”:[‘盘子’、‘叉子’、‘抹刀’],
“客人”:[“约翰”、“马特”、“比尔”]
},
y=[‘培根’、‘西红柿’、‘叉子’];
函数getContainerName(对象,值){
返回对象.键(obj).过滤器(函数(键){
返回y.some(函数(v){
返回obj[key].indexOf(v)!=-1;
})
});
}

log(getContainerName(x,y))我会做一个
&&!a、 包括(b)
在按下
a
之前检查-否则它将包含dupsGood think@tymeJV,但由于对象键在定义上是唯一的,并且在第一次点击时会停止,我认为不存在可能的重复。你能说在哪种情况下会发生吗?啊,是的,nvm-它正在循环键。只有先循环
y
nvm:)@Ackados
let
var
的替代品时,才会发生这种情况,如果您打算在现代浏览器中使用它或使用transpiler,则可以替换它。不过,您可以用
function()
替换箭头函数。使用
.reduce()
,编辑答案以使用普通函数和varNice方法。如果我正确添加了代码,这一个会导致更快的速度@Ackados我认为这是因为这一个的指令比其他的少,但它们只是解决问题的不同方法,选择其中一个取决于情况,以及您是否担心性能或可读性。 function getContainerName(obj, values) { return Object.keys(obj).find(function(key) { return values.every(value => obj[key].find(function(elem) { return elem === value; })); }); } console.log(getContainerName(x, y));
function getContainerName(obj, values) {
  return Object.keys(obj).filter(function(key) {
    return y.some(function(v){
      return obj[key].indexOf(v) !== -1;
    })
  });
}