首页 > 解决方案 > 获取 JavaScript 对象中所有元素的组合

问题描述

我正在尝试编写一个程序,该程序根据我的 JSON 结构生成每个项目,并为每个组合提供一个单独的数字。我在这里找到了一个函数,到目前为止它的工作为我列出了每个组合,但是我无法破译代码,以至于我什至理解它的作用。它给了我所有的项目,听就像Key : Value但老实说,我不知道代码的哪一部分做了什么,我无法访问它来构建我给他们唯一的数字。这是我在这里找到的代码(丢失了它的线程):

    function getCartesian(object) {
        return Object.entries(object).reduce((r, [k, v]) => {
            var temp = [];
            r.forEach(s =>
                (Array.isArray(v) ? v : [v]).forEach(w =>
                    (w && typeof w === 'object' ? getCartesian(w) : [w]).forEach(x =>
                        temp.push(Object.assign({}, s, { [k]: x }))
                    )
                )
            );
            return temp;
        }, [{}]);
    }
    
    var input = { bookSet: { book: ["book1", "book2", "book3"], title: ["title1", "title2"], author: ["author1"], publisher: ["publisher1"] } },
        cartesian = { eachBook: getCartesian(input.bookSet) };

它只是用一种过于高级的语法编写的,我无法远程理解我必须将自己插入到哪里来进行任何计算。我想我所要求的要么是解释,要么是更易于理解和可修改的代码。我绝对需要像这样运行所有元素,并且输出看起来很棒,到目前为止我可以告诉我,我只需要以某种方式计算键并输出从每个对象的元素的组合键中派生的数字。一个例子是书名 2、作者 4 和出版商 3 的书 243。我希望任何人都能理解这一点。非常感谢!

编辑:包括我自己的数据和所需的输出。我展示的组合不需要有意义。

var Product = {
    json:  { Product : {
        assortment: [
        {
            name: "Yoghurt",
            Flavor: ["natural", "honey", "stracciatella"],
            Kind: ["greek", "soy"],            
        },
        {
            name: "Sauce",
        },
        {
            name: "Milk Drink",             
        }
        ],
        Brand: ["Oatly", "Dannon"],
        Containment: ["Cup", "Jar"]
}}};

我的输出我想生成所有这些的组合,并最终在下面的屏幕截图中计算右侧的数字

标签: javascriptcartesian

解决方案


您可以在没有多余部分的情况下获取上述数据,并通过创建嵌套属性的平面数组来简化结果。

结果图片的数量不包括在内,因为每个值与给定数据集的缺失关系。

function getCartesian(object) {
    return Object.entries(object).reduce((r, [k, v]) => {
        var temp = [];
        r.forEach(s =>
            (Array.isArray(v) ? v : [v]).forEach(w =>
                (w && typeof w === 'object' ? getCartesian(w) : [w]).forEach(x =>
                    temp.push(Object.assign({}, s, { [k]: x }))
                )
            )
        );
        return temp;
    }, [{}]);
}

var data = {
        assortment: [
            {
                name: "Yoghurt",
                Flavor: ["natural", "honey", "stracciatella"],
                Kind: ["greek", "soy"],
            },
            {
                name: "Sauce",
            },
            {
                name: "Milk Drink",
            }
        ],
        Brand: ["Oatly", "Dannon"],
        Containment: ["Cup", "Jar"]
    },
    result = getCartesian(data)
        .map(({ assortment: { name, Flavor = '', Kind = '' }, d = '', Brand, f = '', Containment, h = '', i = '', j = '' }) =>
            [name, Flavor, Kind, d, Brand, f, Containment, h, i, j]);

console.log(result.length);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读