Как определить тип поля объекта javascript, которое является массивом

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