使用 'Like' 语句在 JSON 数据中查找相似值
Use a 'Like' statement to find similar values in JSON data
我有一些 JSON 数据。我试图从中获得相似的价值。有什么方法可以使用 javascript 来做到这一点吗?我正在从服务器获取 JSON。但我有一个样本。我正在尝试将不同的浏览器版本加载到他们的 optgroups
中。
有办法吗?
JSON:
[
{
"browser": "Amazon Silk 3.30"
},
{
"browser": "Amazon Silk 49.2"
},
{
"browser": "Edge 42.11"
},
{
"browser": "Edge 42.15"
},
{
"browser": "Google Chrome 0.01"
},
{
"browser": "Google Chrome 0.03"
}
]
HTML
<select id="browsers" style="max-height: 150px; overflow: auto;"></select>
JavaScript
$.getJSON(jsonBrowser, function(data) {
data.forEach((d, i) => {
let browser_val = d.browser.replace(/ /g, "%20");
$('#browsers').append(`<option value=${browser_val} selected>${d.browser}</option>`);
});
});
}
结果:
现在,此代码仅通过下拉菜单填充。
Amazon Silk 3.30
Amazon Silk 49.2
Edge 42.11
Edge 42.15
Google Chrome 0.01
Google Chrome 0.03
我需要的结果:我想在下拉列表中使用 optgroups
来显示:
**Amazon**:
Amazon Silk 3.30
Amazon Silk 49.2
**Edge**:
Edge 42.11
Edge 42.15
**Google**:
Google Chrome 0.01
Google Chrome 0.03
有没有办法使用 JavaScript/jQuery 对它们进行分组?
json 的顺序是否正确?在您的代码的当前状态下,optgroups
只有在所有类似的浏览器依次出现时才有意义。但是如果你有优势,然后 chrome 然后再次优势呢?在这种情况下,我会将其分成 2 个循环
1) 遍历 json
并根据名称
将值推入 new array
2) 遍历新数组并构建内容
var example = [
{
"browser": "Amazon Silk 3.30"
},
{
"browser": "Amazon Silk 49.2"
},
{
"browser": "Edge 42.11"
},
{
"browser": "Edge 42.15"
},
{
"browser": "Google Chrome 0.01"
},
{
"browser": "Google Chrome 0.03"
},
{
"browser": "Edge 42.13"
},
{
"browser": "Amazon Silk 50"
}
]
var grouped_browsers = {
'Edge': [],
'Amazon': [],
'Chrome': []
};
$.each(example, function() {
if (this.browser.indexOf('Edge') !== -1) {
grouped_browsers['Edge'].push(this.browser);
} else if (this.browser.indexOf('Amazon') !== -1) {
grouped_browsers['Amazon'].push(this.browser);
} else if (this.browser.indexOf('Chrome') !== -1) {
grouped_browsers['Chrome'].push(this.browser);
} else {
grouped_browsers['Other'].push(this.browser);
}
});
var rendered_groups = '';
var formatted_browsers = {
'Amazon': 'Amazon Silk',
'Chrome': 'Google Chrome',
'Edge': 'Edge'
};
$.each(grouped_browsers, function(key, value) {
rendered_groups += '<optgroup label="'+formatted_browsers[key]+'">';
$.each(value, function() {
rendered_groups += '<option value="'+this+'">'+this+'</option>';
});
rendered_groups += '</optgroup>';
});
$('#browsers').html(rendered_groups);
我用一个简单的解决方案https://jsfiddle.net/rLbzs1ky/1/做了一个fiddle。
您可以结合使用 Array.prototype.reduce
和 String.prototype.split
来创建一种地图。像这样:
const arr = [{
"browser": "Amazon Silk 3.30"
}, {
"browser": "Amazon Silk 49.2"
}, {
"browser": "Edge 42.11"
}, {
"browser": "Edge 42.15"
}, {
"browser": "Google Chrome 0.01"
}, {
"browser": "Google Chrome 0.03"
}];
const groupBrowser = (accum, el) => {
const [groupName] = el.browser.split(' '); //Group by the first word in the string
if (accum[groupName]) {
accum[groupName].push(el.browser);
} else {
accum[groupName] = [el.browser];
}
return accum;
};
//Use the DOM API to create option elements for each group
const generateOptgroupEls = entry => {
const [key, val] = entry;
const optgroupEl = document.createElement('optgroup');
optgroupEl.label = `**${key}**`;
val.forEach(browser => {
const optionEl = document.createElement('option');
optionEl.value = browser;
optionEl.text = browser;
optgroupEl.appendChild(optionEl);
});
return optgroupEl;
};
//Create the select DOM el we will load up with options
const selectEl = document.createElement('select');
//Group the data
const groups = arr.reduce(groupBrowser, {});
//Create optgroup DOM elements based on group data
const optgroupEls = Object.entries(groups).map(generateOptgroupEls);
//Append the optgroups to the select el
optgroupEls.forEach(optgroupEl => {
selectEl.appendChild(optgroupEl);
});
//Append the select el to the document
document.querySelector('#target').appendChild(selectEl);
<div id="target"></div>
我有一些 JSON 数据。我试图从中获得相似的价值。有什么方法可以使用 javascript 来做到这一点吗?我正在从服务器获取 JSON。但我有一个样本。我正在尝试将不同的浏览器版本加载到他们的 optgroups
中。
有办法吗?
JSON:
[
{
"browser": "Amazon Silk 3.30"
},
{
"browser": "Amazon Silk 49.2"
},
{
"browser": "Edge 42.11"
},
{
"browser": "Edge 42.15"
},
{
"browser": "Google Chrome 0.01"
},
{
"browser": "Google Chrome 0.03"
}
]
HTML
<select id="browsers" style="max-height: 150px; overflow: auto;"></select>
JavaScript
$.getJSON(jsonBrowser, function(data) {
data.forEach((d, i) => {
let browser_val = d.browser.replace(/ /g, "%20");
$('#browsers').append(`<option value=${browser_val} selected>${d.browser}</option>`);
});
});
}
结果: 现在,此代码仅通过下拉菜单填充。
Amazon Silk 3.30
Amazon Silk 49.2
Edge 42.11
Edge 42.15
Google Chrome 0.01
Google Chrome 0.03
我需要的结果:我想在下拉列表中使用 optgroups
来显示:
**Amazon**:
Amazon Silk 3.30
Amazon Silk 49.2
**Edge**:
Edge 42.11
Edge 42.15
**Google**:
Google Chrome 0.01
Google Chrome 0.03
有没有办法使用 JavaScript/jQuery 对它们进行分组?
json 的顺序是否正确?在您的代码的当前状态下,optgroups
只有在所有类似的浏览器依次出现时才有意义。但是如果你有优势,然后 chrome 然后再次优势呢?在这种情况下,我会将其分成 2 个循环
1) 遍历 json
并根据名称
new array
2) 遍历新数组并构建内容
var example = [
{
"browser": "Amazon Silk 3.30"
},
{
"browser": "Amazon Silk 49.2"
},
{
"browser": "Edge 42.11"
},
{
"browser": "Edge 42.15"
},
{
"browser": "Google Chrome 0.01"
},
{
"browser": "Google Chrome 0.03"
},
{
"browser": "Edge 42.13"
},
{
"browser": "Amazon Silk 50"
}
]
var grouped_browsers = {
'Edge': [],
'Amazon': [],
'Chrome': []
};
$.each(example, function() {
if (this.browser.indexOf('Edge') !== -1) {
grouped_browsers['Edge'].push(this.browser);
} else if (this.browser.indexOf('Amazon') !== -1) {
grouped_browsers['Amazon'].push(this.browser);
} else if (this.browser.indexOf('Chrome') !== -1) {
grouped_browsers['Chrome'].push(this.browser);
} else {
grouped_browsers['Other'].push(this.browser);
}
});
var rendered_groups = '';
var formatted_browsers = {
'Amazon': 'Amazon Silk',
'Chrome': 'Google Chrome',
'Edge': 'Edge'
};
$.each(grouped_browsers, function(key, value) {
rendered_groups += '<optgroup label="'+formatted_browsers[key]+'">';
$.each(value, function() {
rendered_groups += '<option value="'+this+'">'+this+'</option>';
});
rendered_groups += '</optgroup>';
});
$('#browsers').html(rendered_groups);
我用一个简单的解决方案https://jsfiddle.net/rLbzs1ky/1/做了一个fiddle。
您可以结合使用 Array.prototype.reduce
和 String.prototype.split
来创建一种地图。像这样:
const arr = [{
"browser": "Amazon Silk 3.30"
}, {
"browser": "Amazon Silk 49.2"
}, {
"browser": "Edge 42.11"
}, {
"browser": "Edge 42.15"
}, {
"browser": "Google Chrome 0.01"
}, {
"browser": "Google Chrome 0.03"
}];
const groupBrowser = (accum, el) => {
const [groupName] = el.browser.split(' '); //Group by the first word in the string
if (accum[groupName]) {
accum[groupName].push(el.browser);
} else {
accum[groupName] = [el.browser];
}
return accum;
};
//Use the DOM API to create option elements for each group
const generateOptgroupEls = entry => {
const [key, val] = entry;
const optgroupEl = document.createElement('optgroup');
optgroupEl.label = `**${key}**`;
val.forEach(browser => {
const optionEl = document.createElement('option');
optionEl.value = browser;
optionEl.text = browser;
optgroupEl.appendChild(optionEl);
});
return optgroupEl;
};
//Create the select DOM el we will load up with options
const selectEl = document.createElement('select');
//Group the data
const groups = arr.reduce(groupBrowser, {});
//Create optgroup DOM elements based on group data
const optgroupEls = Object.entries(groups).map(generateOptgroupEls);
//Append the optgroups to the select el
optgroupEls.forEach(optgroupEl => {
selectEl.appendChild(optgroupEl);
});
//Append the select el to the document
document.querySelector('#target').appendChild(selectEl);
<div id="target"></div>