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