我有一个以下格式的数组:
var jObj = [
{text:'use'},
{text: 'user'},
{text: 'users'},
{text: 'sec'},
{text: 'secu'},
{text: 'secur'},
{text: 'for'},
{text: 'form'}
]
我需要一个返回数组的函数,如:
[
{text: 'users'},
{text: 'secur'},
{text: 'form'}
]
我在这里找到了一些解决方案,但它们都返回了独特的价值,我希望拥有类似模式中唯一最长的字符串。
任何帮助都非常感谢。提前谢谢。
修改
我试过以下代码
var arr2 = []
$.each(jObj, function (index, value) {
if ($.inArray(value.text, arr2) === -1 ) {
arr2.push(value.text);
}
});
这只给了我唯一的值,我正在考虑使用indexOf,但不确定在哪里使用?
答案 0 :(得分:3)
您似乎正在寻找一种方法来删除作为其他字符串前缀的字符串。其余的字符串自然是最长的" kind"。
一个简单的二次时间解决方案可能是这样的:
var jObj = [
{text:'use'},
{text: 'user'},
{text: 'users'},
{text: 'sec'},
{text: 'secu'},
{text: 'secur'},
{text: 'for'},
{text: 'form'}
];
result = jObj.filter(function(a) {
return jObj.every(function(b) {
return a.text == b.text || b.text.indexOf(a.text) < 0;
});
});
document.write("<pre>" + JSON.stringify(result,0,3));
&#13;
如果您的数组非常大(> 1000项),那么更有效的方法是构建前缀树并将其作为&#34; deep&#34;尽可能:参见this answer中的示例。
如果您的输入始终排序,则线性解决方案将迭代它并删除作为下一个前缀的每个元素:
result = jObj.filter(function(item, n, self) {
return !self[n + 1] || self[n + 1].text.indexOf(item.text) < 0;
});
答案 1 :(得分:2)
非二次/线性时间版本:
var jObj = [
{ text: 'use' },
{ text: 'user' },
{ text: 'users' },
{ text: 'sec' },
{ text: 'secu' },
{ text: 'secur' },
{ text: 'for' },
{ text: 'form' },
{ text: 'use'},
{ text: 'abc'},
{ text: '1abc'},
{ text: 'abc1'},
{ text: 'abc2'},
{ text: 'abcd'},
{ text: 'abc'}
];
var result = jObj.reduce(function (r, a) {
r.some(function (b, i) { return ~a.text.indexOf(b.text) && (r[i] = a); }) ||
r.some(function (b) { return ~b.text.indexOf(a.text); }) ||
r.push(a);
return r;
}, []);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');