Как получить значение вложенного массива внутри объекта?

#javascript

#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)}
  

Комментарии:

1. Очень странно, что models некоторые записи являются массивами, а другие — нет. Это действительно часть проблемы, которую вас попросили решить?

Ответ №1:

Вы не можете использовать === (или == ) для сравнения двух разных массивов. Он проверит, являются ли они одним и тем же массивом, а не эквивалентными массивами.

Очень странно, что models некоторые записи являются массивами, другие — объектами, а третьи — простыми строками.

Также странно, что вас просят найти ["350"] . Означает ли это, что вы должны найти автомобили, которые соответствуют всем моделям в этом массиве? Или любой из них? На самом деле не имеет значения, когда массив имеет только одну запись, но массивы по своей природе могут иметь несколько записей…

И странно, что есть запись, в cars которой нет name .

Предполагая, что оно должно быть «любым», тогда вам нужно учитывать тот факт, что некоторые записи в 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 которые не являются объектами массива. Неясно, на какое свойство объекта нужно смотреть.

В целом проблема кажется довольно странной.

Ответ №2:

Вы должны проверить, являются ли ваши внутренние элементы массивами или нет, прежде чем выполнять сравнение, затем вы можете использовать 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'));  

Ответ №3:

Самый простой и короткий ответ, который вы могли найти.

 myObj.cars.find(i => i.models.find( j=>Array.isArray(j) amp;amp; j.includes("320")) )