我的值是在对象内部和嵌套数组中。任务是如果值匹配,那么它应该返回整个对象。 找到值[“ 320”]并返回该对象。
var myObj = {
"name":"John",
"age":30,
"cars": [
{ "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
{ "name":"BMW", "models":[ ["320"], "X3", "X5" ] },
{ "models":[{ "test": "abcd", key:[{bcc:'hello'}] } , "Panda"] }
]
}
这就是我所做的
myObj.cars.find(i => i.models.find(j=>j===["320"]))
预期结果
{name: "BMW", models: Array(3)}
答案 0 :(得分:1)
您不能使用===
(或==
)来比较两个不同的数组。它将检查它们是否为相同数组,而不是等效数组。
models
有一些条目是数组,有些是对象,而另一些是简单的字符串,这很奇怪。
被要求找到["350"]
也很奇怪。这是否意味着您应该找到适合该阵列中所有模型的汽车?还是其中任何一个?数组只有一个条目并不重要,但是数组本质上可以有多个条目...
并且奇怪的是,cars
中有一个没有name
的条目。
假设它应该为“ any”,那么您需要考虑到models
中的某些条目是数组而其他条目不是数组的事实。
var myObj = {
"name":"John",
"age":30,
"cars": [
{ "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
{ "name":"BMW", "models":[ ["320"], "X3", "X5" ] },
{ "models":[{ "test": "abcd", key:[{bcc:'hello'}] } , "Panda"] }
]
};
const modelsToFind = ["320"];
const result = myObj.cars.find(car =>
car.models.find(model => {
// If it's not an array, make it one
if (!Array.isArray(model)) {
model = [model];
}
// Does it have any of the models we want?
return model.some(m => modelsToFind.includes(m));
})
);
console.log(result);
这不能处理models
中非数组对象的条目。尚不清楚对象应该看什么属性。
总体看来,这个问题很奇怪。
答案 1 :(得分:1)
在进行比较之前,您必须检查内部项目是否为数组,然后可以使用Array.prototype.includes()检查内部数组是否也包含您的值:
const myObj = {
"name":"John",
"age":30,
"cars": [
{ "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
{ "name":"BMW", "models":[ ["320"], "X3", "X5" ] },
{ "models":[{ "test": "abcd", key:[{bcc:'hello'}] } , "Panda"] }
]
};
const find = (obj, val) => obj.cars.find(i => i.models.find(j =>
Array.isArray(j) ? j.includes(val) : j === val
));
console.log(find(myObj, '320'));
console.log(find(myObj, 'X3'));
答案 2 :(得分:0)
您能找到的最简单,最短的答案。
myObj.cars.find(i => i.models.find( j=>Array.isArray(j) && j.includes("320")) )