从数组中查找唯一且最大的字符串值

时间:2015-08-11 11:36:58

标签: javascript arrays json

我有一个以下格式的数组:

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,但不确定在哪里使用?

2 个答案:

答案 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;
&#13;
&#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>');