我正在尝试从物化类别路径数组中创建一个类别对象数组。
var data = [
'Business / Finance',
'Business / Management',
'Business / Management / Leadership',
'Business / Team / Leadership'
];
// Expected results:
var result = [
{ name: 'Business', trail: null, path: 'Business' },
{ name: 'Finance', trail: 'Business', path: 'Business / Finance' },
{ name: 'Management', trail: 'Business', path: 'Business / Management' },
{ name: 'Leadership', trail: 'Business / Management', path: 'Business / Management / Leadership' },
{ name: 'Team', trail: 'Business', path: 'Business / Team / Leadership' },
{ name: 'Leadership', trail: 'Business / Team', path: 'Business / Team / Leadership' }
];
如您所见,Business
应该只出现一次,因为所有其他只是子类别。但是,Leadership
应该出现两次,因为它们的结构不同。
当您查看小提琴 http://jsfiddle.net/9uC9Z/ 时,您可以看到Business
存在4次。
我该如何解决这个问题?
如果结果代码非常复杂,我会非常感谢代码注释。
修改
data
数组中的物化路径字符串反映了书籍的类别层次结构。一个例子是:
{
title: 'Leadership 101',
author: 'John Smith',
category: 'Business / Management / Leadership'
}
这只代表一本书。我现在想为每个类别创建一个MongoDB文档。上面的样本书将产生三个类别对象(商业,管理,领导)。但是,如果类别(或子类别)对象/文档已经存在,我不需要创建另一个。
因此result
表示我将存储在MongoDB集合中的类别对象。 (我将添加类别之间的关系,但这不是当前问题的一部分。)
答案 0 :(得分:0)
功能方法:
function extract (path, trail) {
if (path.length === 0) {
return [];
}
var item = {
name: path[path.length - 1],
trail: trail.length === 0 ? null : trail.join(' / '),
path: path.join(' / ')
};
var result = extract(path.slice(0, -1), path.slice(0, -2)).concat([item]);
return result;
}
function distinct (xs) {
function eq (a, b) {
return JSON.stringify(a) === JSON.stringify(b);
}
function contains (xs, x) {
for (var i = xs.length - 1; i >= 0; i--) {
if (eq(xs[i], x)) {
return true;
}
}
return false;
}
var result = [];
for (var i = xs.length - 1; i >= 0; i--) {
if (!contains(result, xs[i])) {
result.push(xs[i]);
}
}
return result;
}
var result = data.
map(function(x) { return x.split(' / ') }).
map(function(x) { return extract(x, x.slice(0, -1)) }).
reduce(function(a, b) { return a.concat(b)});
result = distinct(result);
您可以使用某些库中更强大的内容替换distinct
函数。并且要小心使用JSON.stringify(a) === JSON.stringify(b)
在其他地方进行对象相等。您可以在How to determine equality for two JavaScript objects?