После получения результатов от моего вызова api с почтальоном я пытался получить соответствующий идентификатор значения «KC Content Kind ID» в моей функции успеха ниже, но, поскольку это не массив, мне было интересно, будет ли каждый работать в jquery и как иди об этом. Я хочу пройти через этот вложенный объект json, перейдя к объекту фасета и сказать, если атрибут name равен «KC Content Kind ID», а затем вернуть идентификатор для этого соответствующего атрибута имени.
"results": {
"data": {
"facets": {
"60749428": {
"id": 60749428,
"name": "KC Content Content Kind"
},
"60750276": {
"id": 60750276,
"name": "KC Content Product Version"
},
"69107204": {
"id": 69107204,
"name": "KC Video Audience"
},
"69127027": {
"id": 69127027,
"name": "KC Content Kind ID"
}
}
}
}
Это мой код, и я имею в виду функцию успеха.
function getAvailableKinds() {
$.ajax({
url: csexe + "/api/v2/facets/" +getLocationId(),
dataType: "json",
type: "GET",
beforeSend: function(xhr) {
xhr.setRequestHeader ("OTCSticket", getAuthToken());
},
success: function(response) {
var obj = response.results.data.facets;
$.each(obj, function(item, value){
if ( value.name == 'KC Content Kind ID') {
var idRequired = obj.id;
}
});
},
error: function(jqXHR, textStatus, errorThrown){
alert("An error occurred... Look at the console");
$("body").html('<p>status code: '+jqXHR.status+'</p><p>Error Thrown: ' + errorThrown + '</p><p>Response Text:</p><div>'+jqXHR.responseText + '</div>');
}
});
Итак, я хотел бы сказать, если получить 'id' атрибутов 'name', который соответствует 'KC Content Kind ID' в этом объекте результата
Проблема в том, что ваши данные плохо структурированы. Фасеты должны быть массивом объектов, а не объектом с пронумерованными свойствами. Затем вы можете просто использовать методы массива для поиска правильных данных. Как бы то ни было, вам нужно будет преобразовать эти данные в массив, прежде чем выполнять какие-либо операции с ним, т.е. добавлять по одному шагу для каждой операции.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать Object.keys(), а затем filter результаты, основанные на вашем тесте. Например:
let results = {"data": {"facets": {"60749428": {"id": 60749428,"name": "KC Content Content Kind"},"60750276": {"id": 60750276,"name": "KC Content Product Version"},"69107204": {"id": 69107204,"name": "KC Video Audience"},"69127027": {"id": 69127027,"name": "KC Content Kind ID"}}}}
let obj = results.data.facets;
let k = Object.keys(obj).filter(key => obj[key].name === "KC Content Kind ID")
// an array of all matches
console.info(k)Если вы знаете, что будет только один, find() найдет первое совпадение:
let results = {"data": {"facets": {"60749428": {"id": 60749428,"name": "KC Content Content Kind"},"60750276": {"id": 60750276,"name": "KC Content Product Version"},"69107204": {"id": 69107204,"name": "KC Video Audience"},"69127027": {"id": 69127027,"name": "KC Content Kind ID"}}}}
let obj = results.data.facets;
let k = Object.keys(obj).find(key => obj[key].name === "KC Content Kind ID")
// the first match
console.info(k)Вы получаете идентификатор с Object.entries и find, если знаете, что идентификатор уникален, поскольку Array.find остановится при первом совпадении. Это также вернет идентификатор, а также содержимое объекта.
const d = { "data": { "facets": { "60749428": { "id": 60749428, "name": "KC Content Content Kind" }, "60750276": { "id": 60750276, "name": "KC Content Product Version" }, "69107204": { "id": 69107204, "name": "KC Video Audience" }, "69127027": { "id": 69127027, "name": "KC Content Kind ID" } } } }
const r = Object.entries(d.data.facets).find(([k,v]) => v.name == "KC Content Kind ID")
console.info(r ? r[0] : undefined)Если вы вернете r[1], вы получите объект с этим ключом. r[0] возвращает только ваш совпадающий идентификатор.
Вы можете перебрать объект фасетов и определить, указывает ли последнее слово на отдельное свойство, отличное от name. Если это так, мы возвращаем это свойство, если нет, мы возвращаем name
Object.values(obj).map(o => {
let prop = o.name.split(" ").pop().toLowerCase();
return (prop in o) ? o[prop] : o.name;
});
let apiResult = {
"results": {
"data": {
"facets": {
"60749428": {
"id": 60749428,
"name": "KC Content Content Kind"
},
"60750276": {
"id": 60750276,
"name": "KC Content Product Version"
},
"69107204": {
"id": 69107204,
"name": "KC Video Audience"
},
"69127027": {
"id": 69127027,
"name": "KC Content Kind ID"
}
}
}
}
};
const loop = (obj) => Object.values(obj).map(o => {
let prop = o.name.split(" ").pop().toLowerCase();
return (prop in o) ? o[prop] : o.name;
});
console.info(loop(apiResult.results.data.facets));Если вы собираетесь выполнять эту операцию много раз, вам может показаться, что реструктуризация данных в массив проще в использовании.
const results = {"data":{"facets":{"60749428":{"id":60749428,"name":"KC Content Content Kind"},"60750276":{"id":60750276,"name":"KC Content Product Version"},"69107204":{"id":69107204,"name":"KC Video Audience"},"69127027":{"id":69127027,"name":"KC Content Kind ID"}}}};
// Get a list of the facet keys
const keys = Object.keys(results.data.facets);
// Pull those facet objects into an array
const arr = keys.reduce((acc, key) => acc.concat(results.data.facets[key]), []);
// Find the object that matches the required name, and return the id
const id = arr.find(el => el.name === 'KC Content Kind ID').id;
console.info(id);Используя этот массив, вы можете написать общую функцию для сбора информации:
const arr = [{"id":60749428,"name":"KC Content Content Kind"},{"id":60750276,"name":"KC Content Product Version"},{"id":69107204,"name":"KC Video Audience"},{"id":69127027,"name":"KC Content Kind ID"}];
function findPropFromValue(arr, prop, key) {
const [sKey, sVal] = [...Object.entries(prop)];
return arr.find(el => el[sKey] === sVal)[key];
}
const id = findPropFromValue(arr, { name: 'KC Content Kind ID' }, 'id');
console.info(id);
const name = findPropFromValue(arr, { id: 69107204 }, 'name');
console.info(name);
Итак, вы хотите, чтобы последнее слово, что бы оно ни было, было искомым свойством для объекта, имя которого совпадает с остальным текстом?