#jquery #json
Вопрос:
Во-первых, я все еще учусь, так что, пожалуйста, будьте нежны 🙂 У меня есть ответ json, в котором я хочу выбрать некоторые конкретные элементы. Я пытаюсь получить некоторые элементы с определенным именем внутри объекта и хочу проверить, соответствует ли оно предопределенному имени. Это технические характеристики продукта с определенным названием, таким как «длина», «ширина» и т.д.
У меня возникли проблемы с поиском этих конкретных имен, и если они будут найдены, получите их атрибут «значение».
Итак, у меня есть вот что:
Ответ JSON:
{
"product": {
"specs": {
"231638": {
"id": 231638,
"title": "Length (mm)",
"value": "1200"
},
"231641": {
"id": 231641,
"title": "Width (mm)",
"value": "800"
},
"231644": {
"id": 231644,
"title": "Height (mm)",
"value": "144"
} //etc etc
Теперь я хочу захватить только два value
атрибута из спецификаций «длина» и «высота». Поэтому сначала я должен посмотреть, присутствуют ли эти два имени и соответствуют ли они «длине» и «высоте», и если да, то захватить их value
атрибуты. Вот тут-то мне и нужна помощь.
Конечный результат должен быть
<div class="somediv">
<span class="width">1200</span>
<span class="height">144</span>
</div>
Итак, у меня есть вот что:
$.getJSON(url', function(data){
var specsHtml = [];
$.each(data.product.specs, function(index, spec){
// in here I need to test if the name of the spec equals "length or Height".
specsHtml.push(spec.value);
});
specsHtml = specsHtml.join('');
}
container.find('.product-bottom .measurements span').html(specsHtml);
});
Я совершенно застрял здесь. Я пробовал такие вещи, как:
(spec.hasOwnProperty("title"));
или
var specs = [];
data.product.specs.forEach(data.product.specs => {
if (data.product.specs)
for (var spec in data.product.specs)
specs.push(spec);
})
Любая помощь будет очень признательна 🙂
Ответ №1:
var data = {
"product": {
"specs": {
"231638": {
"id": 231638,
"title": "Length (mm)",
"value": "1200"
},
"231641": {
"id": 231641,
"title": "Width (mm)",
"value": "800"
},
"231644": {
"id": 231644,
"title": "Height (mm)",
"value": "144"
} //etc etc
}
}
};
var length = 0, width = 0, height = 0,
reLength = /length/i,
reWidth = /width/i,
reHeight = /height/i;
$.each(data.product.specs, function (specId, spec) {
if (reLength.test(spec.title))
length = spec.value;
else if (reWidth.test(spec.title))
width = spec.value;
else if (reHeight.test(spec.title))
height = spec.value;
});
var html = '<div class="somediv">'
'<span class="width">w: ' width '</span>'
'<span class="height">h: ' height '</span>'
'<span class="length">l: ' length '</span>'
'</div>';
$(document.body).html(html);
.somediv > span { padding: 10px; display:inline-block; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Комментарии:
1. Спасибо за ваш ответ.! Однако это продолжает возвращать «0» для всех полей. Не могли бы вы также, пожалуйста, объяснить, что означает «/длина/i»?
2. Хорошо, я, кажется, понимаю, что происходит не так. Ваше тестирование
spec.title
с помощью этого регулярного выражения, например, ширины. Однако это всегда будет ложным, так как его нужно сравнивать сvalue name
этим спецификацией. Можете ли вы помочь в этом?3. @Meules, я заменил код на выполняемый фрагмент кода. Проверить это
4. Хорошо, теперь я понял 🙂 Это регулярное выражение ищет часть имени, а не полное имя! Это работает сейчас… много раз!
Ответ №2:
$.getJSON(url, function(data){
var specsHtml = "<div class="somediv">";
$.each(data.product.specs, function(){
//'this' is now your current 'spec' which is { "id": ..., "title": ..., etc. }
specsHtml = '<span class="';
if (this.title.includes('Length'))
specsHtml = 'length';
else
specsHtml = 'width';
specsHtml = specsHtml '">' this.value '</span>';
});
specsHtml = '</div>';
}
container.find('.product-bottom .measurements span').html(specsHtml);
});