首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何生成与对象中的属性关联的数组数据的所有排列?

如何生成与对象中的属性关联的数组数据的所有排列?
EN

Stack Overflow用户
提问于 2021-06-19 15:08:12
回答 2查看 138关注 0票数 1

我正在编写一个编码练习,我的目标是在NodeJS中编写一个名为Object的函数,该函数以单个Object作为参数。使用该对象中的所有Array属性,生成一个JS对象数组:

  • 每个对象都是在属性数组中找到的值的唯一排列。
  • A值为空数组的属性可以忽略。如果Object参数中的属性不是数组,则应将其视为包含单个值的数组。

代码语言:javascript
运行
复制
{
  pilot: ["Han Solo", "Lando Calrissian"],
  copilot: ["Chewbacca", "Rey"],
  ship: "Falcon",
  speed: "1.5c"
}

在本例中,该函数应该产生以下排列:

代码语言:javascript
运行
复制
[
  {
    "pilot": "Han Solo",
    "copilot": "Chewbacca",
    "ship": "Falcon",
    "speed": "1.5c"
  },
  {
    "pilot": "Han Solo",
    "copilot": "Rey",
    "ship": "Falcon",
    "speed": "1.5c"
  },
  {
    "pilot": "Lando Calrissian",
    "copilot": "Chewbacca",
    "ship": "Falcon",
    "speed": "1.5c"
  },
  {
    "pilot": "Lando Calrissian",
    "copilot": "Rey",
    "ship": "Falcon",
    "speed": "1.5c"
  }
]

我一直在关注这个问题:How can I create all combinations of this object's keys/values in JavaScript?,但我不能完全理解,因为我只能传递一个参数。

我对此感到迷茫,任何指点都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2021-06-19 15:27:33

如果带有对象的数组再次调用getCartesian并构建新的对象,则可以使用一个递归函数来分离所有键/值对,并通过迭代这些值构建一个新的笛卡儿积。

代码语言:javascript
运行
复制
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 = { pilot: ["Han Solo", "Lando Calrissian"], copilot: ["Chewbacca", "Rey"], ship: "Falcon", speed: "1.5c" };

console.log(getCartesian(data));
代码语言:javascript
运行
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 1
EN

Stack Overflow用户

发布于 2021-06-19 17:06:29

这是我的解决方案的版本,结果没有相同的顺序,但是数据是100%被置换的。

代码语言:javascript
运行
复制
let data = {
  pilot: ["Han Solo", "Lando Calrissian"],
  copilot: ["Chewbacca", "Rey"],
  ship: "Falcon",
  speed: "1.5c"
};

let newData = new Array();

let currentData = {};

let saveProperty = new Array();

for(let index = 0;index < data.pilot.length; index++){
        for(let property in data){
          
          if(Array.isArray(data[property])){

            if(saveProperty.findIndex(function(e){
                if(e == property){
                    return true;
                }
            }) == -1){

                saveProperty.push(property);
            }
            
            currentData[property] = data[property][index];

          }else{

            currentData[property] = data[property];

          }

        }

        //newData.push(currentData);
    
        

        for(let pr of saveProperty){
            
            data[pr].forEach(function(e, i){

                let copy = {};

                Object.assign(copy,currentData);
                    
                copy[pr] = data[pr][i];


                if(newData.findIndex(function(e){
                    let counter = 0;
                    for(let en in copy){
                        
                        if(copy[en] == e[en]){
                            
                            counter++;
                                                        
                        }

                    }

                    if(counter == Object.keys(copy).length){
                        return true;
                    }
                }) == -1){

                    newData.push(copy);
                }

            });
            
        }

        saveProperty = new Array();

        currentData = {};
    
    

}

console.log(newData);

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

https://stackoverflow.com/questions/68048091

复制
相关文章

相似问题

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