javascript - 基于两个数组创建一个数组

标签 javascript arrays

我有两个数组 detailsoptions 来自不同的来源(web api 请求)

details: [
      { id: 'groups', option: true },
      { id: 'category', option: false }
]


 options: {
        groups: [ 
          { id: 'g1' },
          { id: 'g2' }
        ],
        category: [
          { id: 'c1' },
          { id: 'c2' }
        ],
        other: [
          { id: 'o1' },
          { id: 'o2' }
        ],
    }

我想像这样组合这些拖车阵列

combined: [
        groups: 
            {
                options:[ 
                    { id: 'g1' },
                    { id: 'g2' }
                ], 
                details: { option: true}
            },
        category: 
                {
                 options:   [ 
                    { id: 'c1' },
                    { id: 'c2' }
                ], 
                details: { option: false}
            },
    ]

基本上,如果 details 中的任何 idoptions 属性匹配,它应该以相同的属性名称和所有 进入新数组code>details 除了 id 转到相关的 details 属性。

最好的方法是什么? lodash 可以处理吗?

最佳答案

如果您只需要optionsdetails ( intersection ) 中的项目:

var details = [
      { id: 'groups', option: true },
      { id: 'category', option: false }
]

var options = {
        groups: [ 
          { id: 'g1' },
          { id: 'g2' }
        ],
        category: [
          { id: 'c1' },
          { id: 'c2' }
        ],
        other: [
          { id: 'o1' },
          { id: 'o2' }
        ]
    }

var combined = {};
details.forEach(({id: id, option: option}) => {
  if (options[id]) {
    combined[id] = combined[id] || {};
    combined[id].options = options[id];
    combined[id].details = {option: option};
  }
})

console.log(JSON.stringify(combined, null, "\t"))
/*
{
  "groups": {
    "options": [
      {
        "id": "g1"
      },
      {
        "id": "g2"
      }
    ],
    "details": {
      "option": true
    }
  },
  "category": {
    "options": [
      {
        "id": "c1"
      },
      {
        "id": "c2"
      }
    ],
    "details": {
      "option": false
    }
  }
}
*/

如果您想保留 optionsdetails 中的所有项目,无论它们是否匹配 (union):

var details = [
      { id: 'groups', option: true },
      { id: 'category', option: false }
]

var options = {
        groups: [ 
          { id: 'g1' },
          { id: 'g2' }
        ],
        category: [
          { id: 'c1' },
          { id: 'c2' }
        ],
        other: [
          { id: 'o1' },
          { id: 'o2' }
        ]
    }

var combined = {};

Object.keys(options).forEach(id => {
  combined[id] = {};
  combined[id].options = options[id];
})
details.forEach(({id: id, option: option}) => {
  combined[id] = combined[id] || {};
  combined[id].details = {option: option};
})

console.log(JSON.stringify(combined, null, "\t"))
/*
{
  "groups": {
    "options": [
      {
        "id": "g1"
      },
      {
        "id": "g2"
      }
    ],
    "details": {
      "option": true
    }
  },
  "category": {
    "options": [
      {
        "id": "c1"
      },
      {
        "id": "c2"
      }
    ],
    "details": {
      "option": false
    }
  },
  "other": {
    "options": [
      {
        "id": "o1"
      },
      {
        "id": "o2"
      }
    ]
  }
}
*/

关于javascript - 基于两个数组创建一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47007873/

相关文章:

c - 如何迭代复合文字数组

javascript - 我怎样才能用d3把一个圆圈放在前面?

javascript - JQGrid 在标题栏中显示过滤器详细信息

正则表达式 : How can I surround all words starting with @ with <b> tags?

javascript - 当颜色框关闭时显示复选标记

javascript - fadeIn() 数组中的元素,在不同时间随机(即,不按顺序)

java - java中从arraylist中删除具有多个索引的多个元素

java - 如何检查数组是否不为空且其中某些特定值是否为数字?

Java 从多数组中选择一个随机项而不是再次使用它?

javascript - 如何使用原型(prototype)选择一个选项