如何获取对象内部嵌套数组的值?

时间:2019-04-15 11:29:32

标签: javascript

我的值是在对象内部和嵌套数组中。任务是如果值匹配,那么它应该返回整个对象。 找到值[“ 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)}

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")) )