这就是问题所在。说我有这些字符串:
我希望这些字符串分组如下:
重点是将项目的名称与其属性(颜色,内存容量等)分开。
我使用此算法查找最长的公共子字符串: link
你们可以分享你的想法吗?无需代码或实现。谢谢。
编辑:
this.data = _.sortBy(this.data, function(item) {
return item.title;
});
var i = 0;
var groups = {};
var len = this.data.length - 1;
while(i < len) {
var key = this.lcs(this.data[i][this.attr], this.data[i+1][this.attr]) || this.data[i][this.attr];
groups[key] = true;
i++;
while(this.data[i][this.attr].startsWith(key) && i < len) {
i++;
}
}
console.log(groups)
这很好用(仅测试添加键)。但是我想添加三星s3 galaxy来列出。谢谢你的帮助!
答案 0 :(得分:1)
如果你只想简单地按最长公共前缀分组(这意味着即使“苹果ipad”会产生更大的组,也会选择“apple ipad mini”),那么可能是这样的吗?
sort the list
i = 0
while i < end of list:
key = longest common prefix of list[i] & list[i + 1]
or list[i] if the common prefix is less than (1?) words or i is the last index
groups[key] = list[i++]
while key is prefix of list[i]:
add list[i++] to groups[key]
答案 1 :(得分:0)
尝试通过比较具有相同单词的两个字符串来解决问题,并查看单词的长度是否小于上一个路径。
function groupObject(i, l) {
return { item: i, length: l };
}
function group(r, a, i, o) {
var rr = r.item.split(' '),
aa = a.split(' '),
j = 0,
key, keys = [];
while (aa[j] === rr[j]) {
keys.push(aa[j]);
j++;
}
if (keys.length < r.length && i < o.length - 1) {
return group(groupObject(o[i + 1], 0), a, Number.MAX_VALUE, o);
}
key = keys.join(' ');
if (!key || keys.length < r.length && i === o.length - 1) {
key = a;
}
grouped[key] = grouped[key] || [];
grouped[key].push(a);
return groupObject(a, keys.length);
}
var data = ['apple ipad mini 32gb', 'apple ipad mini 64gb', 'apple ipad air 64gb', 'apple ipad air 32gb', 'panasonic gh4', 'samsung s2 galaxy', 'samsung s2 galaxy red', 'samsung s3 galaxy'],
grouped = {};
data.reduce(group, groupObject(data[1], 0));
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');
&#13;