#javascript #typescript
#javascript #typescript
Вопрос:
У меня есть объект JavaScript, который поступает из запроса, который может включать вложенные поля, мне нужно определить поле, которое является типом массива<{}>, и мне нужно выполнить итерацию только этого поля, но в javascript я не смог этого достичь. кто-нибудь, пожалуйста, предложите мне решение для поиска поля на основе типа поля.
пример объекта
const obj = {
name:'jane',
age: 22,
interested_books:[{book_name:'xxx', author_name:'yyy'}, {book_name:'aaa', author_name:'zzz'}],
hobbies:['reading', 'football'],
address:{street_name:'dace street', door_no:12}
}
Среди этих полей мне нужно повторить поле, которое является массивом<{}> (т.е. interested_books)
Комментарии:
1. В JavaScript нет таких типов, как
Array<{}>
. Вы говорите о TypeScript?2. да, это typescript @Barmar
Ответ №1:
Используйте Object.entires()
и isArray
, чтобы проверить, является ли это массивом
obj = {
name: "jane",
age: 22,
interested_books: [
{ book_name: "xxx", author_name: "yyy" },
{ book_name: "aaa", author_name: "zzz" },
],
hobbies: ["reading", "football"],
address: { street_name: "dace street", door_no: 12 },
};
function getArrWithOb(obj) {
return Object.fromEntries(
Object.entries(obj).filter((o) => {
if (Array.isArray(o[1])) {
if (o[1].every((ob) => typeof ob == "object")) {
return o;
}
}
})
);
}
console.log(getArrWithOb(obj));
Из комментариев похоже, что вы хотите, чтобы вам вернули имя свойства
Вы могли бы использовать reduce
obj = { name: "jane", age: 22, interested_books: [ { book_name: "xxx", author_name: "yyy" }, { book_name: "aaa", author_name: "zzz" }, ], hobbies: ["reading", "football"], address: { street_name: "dace street", door_no: 12 }, };
function getArrWithOb(obj) {
return Object.entries(obj).reduce((r, o) => {
if (Array.isArray(o[1])) {
if (o[1].every((ob) => typeof ob == "object")) {
r.push(o[0]);
}
}
return r;
}, []);
}
console.log(getArrWithOb(obj));
Комментарии:
1. это также повторяющийся тип массива, мне нужно повторить поле, которое является массивом<{}> , возможно, получение поля в качестве вывода также нормально (т. е.
interested_books
)2. Я обновил свой ответ, проверьте его и дайте мне знать, работает ли он для вас
3. возможно ли также получить имя ключа в качестве выходных данных?
4. Я обновил свой ответ, дайте мне знать, если это сработает для вас
5. Нет, мне просто нужно
interested_books
, чтобы в качестве вывода функция возвращала вместо console.log()
Ответ №2:
Используйте isArray, чтобы проверить, является ли значение массивом
const obj = {
name: 'jane',
age: 22,
interested_books: [{
book_name: 'xxx',
author_name: 'yyy'
}, {
book_name: 'aaa',
author_name: 'zzz'
}],
hobbies: ['reading', 'football'],
address: {
street_name: 'dace street',
door_no: 12
}
}
for (let keys in obj) {
if (Array.isArray(obj[keys])) {
obj[keys].forEach(item => console.log(item))
}
}
Комментарии:
1. это также повторяющийся тип массива, мне нужно повторить поле, которое является массивом<{}> , возможно, получение поля в качестве вывода также нормально (т. е.
interested_books
)
Ответ №3:
Вы также можете использовать instanceof
const obj = {
name:'jane',
age: 22,
interested_books:[{book_name:'xxx', author_name:'yyy'}, {book_name:'aaa', author_name:'zzz'}],
hobbies:['reading', 'football'],
address:{street_name:'dace street', door_no:12}
}
for (const v in obj) obj[v] instanceof Array amp;amp; console.log(obj[v]);
Ответ №4:
const obj = {
name: 'jane',
age: 22,
interested_books: [{
book_name: 'xxx',
author_name: 'yyy'
}, {
book_name: 'aaa',
author_name: 'zzz'
}],
hobbies: ['reading', 'football'],
address: {
street_name: 'dace street',
door_no: 12
}
}
for (const key in obj) {
if (obj[key] instanceof Array) {
console.log('I am array', key);
const isArrayOfObject = obj[key].every(item => typeof item === "object");
if (isArrayOfObject) {
// your_logic_here
}
}
}
Ответ №5:
Попробуйте функцию ниже. Это делается для получения элементов в объекте, которые являются массивами.
const obj = {
name: 'jane',
age: 22,
interested_books: [{ book_name: 'xxx', author_name: 'yyy' }, { book_name: 'aaa', author_name: 'zzz' }],
hobbies: ['reading', 'football'],
address: { street_name: 'dace street', door_no: 12 }
};
const getArraysFromObject = obj => {
const results = {};
Object.keys(obj).map(field => {
if (Array.isArray(obj[field])) {
results[field] = obj[field];
}
});
return results;
};
console.log(results);
// {
// "interested_books": [
// { "book_name": "xxx", "author_name": "yyy" },
// { "book_name": "aaa", "author_name": "zzz" }
// ],
// "hobbies": ["reading", "football"]
// }
Ответ №6:
Вы можете использовать typeof, чтобы проверить, является ли значение массивом
const obj = {
name:'jane',
age: 22,
interested_books:[{book_name:'xxx', author_name:'yyy'}, {book_name:'aaa', author_name:'zzz'}],
hobbies:['reading', 'football'],
address:{street_name:'dace street', door_no:12}
}
for (x in obj) {
txt = obj[x];
if(typeof(txt) == "object")
{
for(oj in txt)
{
ojval = txt[oj];
console.log(ojval);
}
}
}