Как получить элементы внутреннего массива путем сопоставления значения ключа в React JS

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