#javascript #reactjs #react-native #react-router
Вопрос:
Я пытался извлечь внутренние элементы с помощью ReactJS. Если мой ввод-страна=Новая Зеландия, то я ожидаю 4 результата, он также должен учитывать внутренний массив, однако, когда я использовал jsonQuery, он не может перейти во внутренний массив и получить только 3 результата, и он не входит в friends1. Есть ли какой-нибудь способ, которым мы также можем извлечь внутренние элементы массива?
var result1 = jsonQuery('grouped_people[**][*country=NZ]', {data: data1}).value;
console.log(result1);
console.log("Array1");
var data1 = {
grouped_people: {
'friends': [
{ name: 'Steve', country: 'NZ' },
{ name: 'Jane', country: 'US' },
{ name: 'Mike', country: 'AU' },
{ name: 'Mary', country: 'NZ' },
],
'enemies': [
{ name: 'Steve', country: 'NZ' },
{
'friends1': [
{ name: 'Evil Steve', country: 'India' },
{ name: 'Betty', country: 'NZ' },
]
}]
}
}
Комментарии:
1. Вы хотите использовать только JSONQuery или ваниль тоже хороша?
2. Я новичок в реагировании, поэтому я использовал jsonQuery, не уверенный в ванили.
Ответ №1:
Вы должны быть в состоянии оптимизировать его в соответствии с вашим удобством.
var data1 = {
grouped_people: {
'friends': [
{ name: 'Steve', country: 'NZ' },
{ name: 'Jane', country: 'US' },
{ name: 'Mike', country: 'AU' },
{ name: 'Mary', country: 'NZ' },
],
'enemies': [
{ name: 'Steve', country: 'NZ' },
{
'friends1': [
{ name: 'Evil Steve', country: 'India' },
{ name: 'Betty', country: 'NZ' },
]
}]
}
}
const COUNTRY = "NZ";
const arr = [];
function getObject(obj) {
if (obj.country) {
if (obj.country === COUNTRY) {
arr.push(obj);
return;
}
} else {
Object.keys(obj).map(key => {
obj[key].map(item => {
getObject(item);
});
});
}
}
getObject(data1.grouped_people);
console.log(arr);
Ответ №2:
Я использовал рекурсию, чтобы проверить (внутри check
функции), является ли переданный аргумент объектом. Если это так, то проверьте наличие ключа country
и name
, и если они существуют, и country
значение соответствует inp
, затем увеличьте значение result1
на 1, а если ключей не существует, вызовите функцию для значений ключей.
если тип не является объектом, то получите каждый элемент нового объекта(который может быть только массивом) и вызовите функцию над ним.
let inp = 'NZ';
var result1 = 0;
console.log(result1);
console.log("Array1");
var data1 = {
grouped_people: {
'friends': [
{ name: 'Steve', country: 'NZ' },
{ name: 'Jane', country: 'US' },
{ name: 'Mike', country: 'AU' },
{ name: 'Mary', country: 'NZ' },
],
'enemies': [
{ name: 'Steve', country: 'NZ' },
{
'friends1': [
{ name: 'Evil Steve', country: 'India' },
{ name: 'Betty', country: 'NZ' },
]
}]
}
}
function check(obj) {
if (!Array.isArray(obj)) {
let keys = Object.keys(obj);
if(keys.includes('country') amp;amp; keys.includes('name')) {
if(obj['country'] == inp) {
result1 = 1
}
}else {
keys.map(key => {
check(obj[key])
})
}
}
else {
obj.map(ob => {
check(ob)
})
}
return result1;
}
let res = check(data1);
console.log(res);
Ответ №3:
Если использование jsonQuery не является абсолютно необходимым, вы можете разложить нужные объекты в набор данных и отформатировать его с помощью фильтра.
let resultSet = [...data1.grouped_people.friends, data1.grouped_people.enemies[0], ...data1.grouped_people.enemies[1].friends1]
resultSet.filter(e => e.country == 'NZ')