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