Возврат родительского ключа на основе значения в списке массивов в Javascript

#javascript #arrays #object

Вопрос:

 {
"arr1":[
    {
      "name":"something1",
      "id":"233111f4-9126-490d-a78b-1724009fa484"
    },
    {
       "name":"something2",
       "id":"50584c03-ac71-4225-9c6a-d12bcc542951"
    },
    {
       "name":"Unique",
       "id":"43cf14ee58ea4d8da43e9a2f208d215c"
    },
    {
       "name":"something4",
       "id":"ce0374ba-6d9b-4ff5-98b1-1191d1d2a9a7"
    },
    {
       "name":"something5",
       "id":"ef825dc3-003c-4740-955a-bb437cfb4199"
    }
],

"arr2":
 [
   {
     "name":"Unique",
     "id":"43cf14ee58ea4d8da43e9a2f208d215c"}
 ]
}
 

Это список массивов с ключами и значениями в виде массива, я хочу вернуть все ключи на основе определенного значения;

Например: я хочу вернуть родительские ключи [arr1,arr2], причина в том, что оба массива содержат уникальное значение, поэтому я хочу вернуть родительский ключ обоих значений, который является arr1 и arr2 соответственно.

Примечание: Список может содержать n чисел массивов.

Любая помощь будет признательна. Заранее спасибо.

Комментарии:

1. Добро пожаловать в SO! Пожалуйста, предоставьте код с тем, что вы пробовали до сих пор и с чем у вас сейчас проблемы

Ответ №1:

Самый простой способ сделать это -:

  • Перебирайте ключи в своем объекте
  • Проверьте, содержит ли массив какие-либо объекты с именем «Уникальный».
  • Если это так, добавьте ключ objects в массив
 const obj = {
  "arr1": [{ "name": "something1", "id": "233111f4-9126-490d-a78b-1724009fa484" }, { "name": "something2", "id": "50584c03-ac71-4225-9c6a-d12bcc542951" }, { "name": "Unique", "id": "43cf14ee58ea4d8da43e9a2f208d215c" }, { "name": "something4", "id": "ce0374ba-6d9b-4ff5-98b1-1191d1d2a9a7" }, { "name": "something5", "id": "ef825dc3-003c-4740-955a-bb437cfb4199" }],
  "arr2": [{ "name": "Unique", "id": "43cf14ee58ea4d8da43e9a2f208d215c" }],
  "arr3": [{ "name": "No unique here","id": "Example" }]
}

// Create our array that will contain the keys
const keys = []
// Loop through each key in the object
for (const prop in obj) {
  // Use .some to see if any of the objects in this array have the selected name
  const containsUnique = obj[prop].some(o => o.name === 'Unique')
  if (containsUnique) {
    // Add the current key to the array
    keys.push(prop)
  }
}
// Use the array of keys which contain an object named "Unique"
console.log(keys) 

Комментарии:

1. Вы можете использовать цикл фильтрации developer.mozilla.org/fr/docs/Web/JavaScript/Reference/…

2. @SullivanTobias Вы могли бы, но на самом деле не имеет значения, сколько объектов имеют это имя в массиве, поэтому find() , я думаю, просто поиск первых элементов должен быть немного более эффективным (так как он находит только первое совпадение).

3. .some() это даже лучше, чем проверка правдивости/ложности, так как она просто возвращает истину/ложь.

4. @DBS Спасибо, что это отличное решение, У меня есть последний вопрос: Что, если эта операция запускается при событии, которое дает мне уникальное значение, В этом случае она будет продолжать нажимать на опору, и в конечном результате я буду получать повторяющиеся значения внутри массива ключей.

5. @Виш, Если вы хотите сравнить с другим значением, вы можете просто 'Unique' заменить его переменной, содержащей вашу строку. Я не уверен, что понимаю вопрос о повторяющихся значениях, это должно быть возможно только для возврата/не возврата каждого ключа в объекте, а поскольку ключи объектов должны быть уникальными, в массиве никогда не должно быть повторяющейся строки keys . (Правка: Если вы запускаете его несколько раз, каждый раз обязательно создавайте новый пустой keys массив)

Ответ №2:

Это более общий подход:

 const getKeysByValue = (data, value) => {
    const dataKeys = Object.keys(data);
    const valueKey = Object.keys(value);
    return dataKeys.filter(currKey => {
        for(let element of data[currKey])
            if(element[valueKey] === value[valueKey]) 
                return true;
    });
}

const data = {
    "arr1":[
        {
          "name":"something1",
          "shape": "Trapezium",
          "id":"233111f4-9126-490d-a78b-1724009fa484"
        },
        {
           "name":"something2",
           "shape": "Octagon",
           "id":"50584c03-ac71-4225-9c6a-d12bcc542951"
        },
        {
           "name":"Unique",
           "shape": "Square",
           "id":"43cf14ee58ea4d8da43e9a2f208d215c"
        },
        {
           "name":"something4",
           "shape": "Triangle",
           "id":"ce0374ba-6d9b-4ff5-98b1-1191d1d2a9a7"
        },
        {
           "name":"something5",
           "shape": "Circle",
           "id":"ef825dc3-003c-4740-955a-bb437cfb4199"
        }
    ],
    
    "arr2":
     [
        {
         "name":"Unique",
         "shape": "Triangle",
         "id":"43cf14ee58ea4d8da43e9a2f208d215c"
        }
     ],

     "arr3":
     [
        {
         "name":"Not-Unique",
         "shape": "Circle",
         "id":"8hcf14ee58ea25g343e9a2f208df215c"
        }
     ]
}

console.log(getKeysByValue(data, {"name": "something2"})); // ["arr1"]
console.log(getKeysByValue(data, {"name": "Unique"})); // ["arr1", "arr2"]
console.log(getKeysByValue(data, {"shape": "Circle"})); // ["arr1", "arr3"]
console.log(getKeysByValue(data, {"shape": "Square"})); // ["arr1"] 

Функция получает два параметра, data и value . value ожидается, что оно будет в формате значения, которое вы хотите отфильтровать. В вашем примере вы хотели, чтобы это было "Unique" так, и в каждом объекте в массиве оно было представлено так "name": "Unique" , чтобы мы отправили его как объект, {"name": "Unique"} .

Таким образом, у вас может быть другое значение для фильтрации. В приведенном выше примере я добавил ключ формы и значение для каждого элемента, мы также можем фильтровать по этому значению, как показано в приведенном выше примере.

Ответ №3:

ты можешь сделать вот так :

 const obj = {
  "arr1": [{ "name": "something1", "id": "233111f4-9126-490d-a78b-1724009fa484" }, { "name": "something2", "id": "50584c03-ac71-4225-9c6a-d12bcc542951" }, { "name": "Unique", "id": "43cf14ee58ea4d8da43e9a2f208d215c" }, { "name": "something4", "id": "ce0374ba-6d9b-4ff5-98b1-1191d1d2a9a7" }, { "name": "something5", "id": "ef825dc3-003c-4740-955a-bb437cfb4199" }],
  "arr2": [{ "name": "Unique", "id": "43cf14ee58ea4d8da43e9a2f208d215c" }],
  "arr3": [{ "name": "No unique here","id": "Example" }]
}

arr=[]
//loop over dict with pair keys and value 
for (const [key, value] of Object.entries(obj)) {
//get the list of name from dict and check it if it contains Unique string 
  value.map(e=>e.name).includes("Unique") ? arr.push(key) : false
}
console.log(arr)
 

Ответ №4:

Вы можете использовать some метод массива

 const data = {
  "arr1": [{
      "name": "something1",
      "id": "233111f4-9126-490d-a78b-1724009fa484"
    },
    {
      "name": "something2",
      "id": "50584c03-ac71-4225-9c6a-d12bcc542951"
    },
    {
      "name": "Unique",
      "id": "43cf14ee58ea4d8da43e9a2f208d215c"
    },
    {
      "name": "something4",
      "id": "ce0374ba-6d9b-4ff5-98b1-1191d1d2a9a7"
    },
    {
      "name": "something5",
      "id": "ef825dc3-003c-4740-955a-bb437cfb4199"
    }
  ],

  "arr2": [{
    "name": "Unique",
    "id": "43cf14ee58ea4d8da43e9a2f208d215c"
  }]
}

var obj = [],
  keys;
for (keys in data) {
  data[keys].some(a => "Unique" === a.name) amp;amp; obj.push(keys);
}
console.log(obj); 

Ответ №5:

Альтернативный способ, который я мог бы придумать, — использовать регулярное выражение

 var obj = {
"arr1":[
    {
      "name":"something1",
      "id":"233111f4-9126-490d-a78b-1724009fa484"
    },
    {
       "name":"something2",
       "id":"50584c03-ac71-4225-9c6a-d12bcc542951"
    },
    {
       "name":"Unique",
       "id":"43cf14ee58ea4d8da43e9a2f208d215c"
    },
    {
       "name":"something4",
       "id":"ce0374ba-6d9b-4ff5-98b1-1191d1d2a9a7"
    },
    {
       "name":"something5",
       "id":"ef825dc3-003c-4740-955a-bb437cfb4199"
    }
],

"arr2":
 [
   {
     "name":"Unique",
     "id":"43cf14ee58ea4d8da43e9a2f208d215c"}
 ]
}

let str = JSON.stringify(obj);
let match = str.matchAll(/"([wd] )":[(?:{[sS] },)*{"name":"Unique"/g);

let parent = [];
for(let m of match){
   parent.push(m[1]);
}