首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自物化路径的对象

来自物化路径的对象
EN

Stack Overflow用户
提问于 2014-01-26 17:26:23
回答 1查看 713关注 0票数 1

我试图从一个物化类别路径数组中创建一个类别对象数组。

代码语言:javascript
复制
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数组中的物化路径字符串反映书籍的类别层次结构。一个例子是:

代码语言:javascript
复制
{
    title: 'Leadership 101',
    author: 'John Smith',
    category: 'Business / Management / Leadership'
}

那只是一本书。现在我想为每个类别创建一个MongoDB文档。上面的样书将产生三个类别的对象(业务,管理,领导)。但是,如果类别(或子类别)对象/文档已经存在,则不需要创建另一个对象/文档。因此,result表示我将存储在MongoDB集合中的类别对象。(我将在类别之间添加关系,但这不是当前问题的一部分。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-26 19:21:10

职能方法:

代码语言:javascript
复制
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?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21366735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档