javascript - 通过 _id 匹配并提取两个对象数组之间的元素

标签 javascript arrays

我有 2 个数组:

数组一:

[
  {
    "value": {
      "_id": "5ce3f8cc35ad1e0999ee18d1",
      "is_default": false,
      "is_required": true,
      "sort_order": 0,
      "value": "",
      "label": "No 38",
      "option_id": "5ce3f8cc35ad1e0999ee18d0",
      "__v": 0,
      "selected": true
    }
  },
  {
    "value": {
      "label": "Τρικολορ",
      "sort_order": 0,
      "value": "#7a3131|#0e8e76|#b6edd9",
      "_id": "3aa5b2d7-cb78-44ce-bb5d-e4d42ebf3309",
      "selected": true
    }
  },
  {
    "value": {
      "label": "ΧΛ",
      "sort_order": 0,
      "value": "",
      "_id": "5df37c50854df50b274d7829",
      "selected": true
    }
  }
]

数组二:

[
  {
    "_id": "5df384edba99411550e4e019",
    "options": [
      {
        "option": {
          "sort_order": 0,
          "display_name": "Μέγεθος (EU)",
          "type": "text",
          "display_style": "dropdown"
        },
        "value": {
          "_id": "5ce3f8cc35ad1e0999ee18d1",
          "is_default": false,
          "is_required": true,
          "sort_order": 0,
          "value": "",
          "label": "No 38",
          "option_id": "5ce3f8cc35ad1e0999ee18d0",
          "__v": 0
        }
      },
      {
        "option": {
          "display_name": "swatch",
          "display_style": "swatch",
          "sort_order": 0,
          "type": "swatch"
        },
        "value": {
          "label": "Τρικολορ",
          "sort_order": 0,
          "value": "#7a3131|#0e8e76|#b6edd9",
          "_id": "3aa5b2d7-cb78-44ce-bb5d-e4d42ebf3309"
        }
      },
      {
        "option": {
          "display_name": "dropdown",
          "display_style": "dropdown",
          "sort_order": 0,
          "type": "multiplechoice"
        },
        "value": {
          "_id": "5df37c61854df50b274d782a",
          "is_default": false,
          "is_required": true,
          "label": "Λ",
          "sort_order": 0,
          "value": "",
          "value_data": null
        }
      }
    ]
  },
  {
    "_id": "5ce3f8cc35ad1e0999ee18d1",
    "options": [
      {
        "option": {
          "sort_order": 0,
          "display_name": "Μέγεθος (EU)",
          "type": "text",
          "display_style": "dropdown"
        },
        "value": {
          "_id": "5ce3f8cc35ad1e0999ee18d1",
          "is_default": false,
          "is_required": true,
          "sort_order": 0,
          "value": "",
          "label": "No 38",
          "option_id": "5ce3f8cc35ad1e0999ee18d0",
          "__v": 0
        }
      },
      {
        "option": {
          "display_name": "swatch",
          "display_style": "swatch",
          "sort_order": 0,
          "type": "swatch"
        },
        "value": {
          "label": "Τρικολορ",
          "sort_order": 0,
          "value": "#7a3131|#0e8e76|#b6edd9",
          "_id": "3aa5b2d7-cb78-44ce-bb5d-e4d42ebf3309"
        }
      },
      {
        "option": {
          "display_name": "dropdown",
          "display_style": "dropdown",
          "sort_order": 0,
          "type": "multiplechoice"
        },
        "value": {
          "label": "ΧΛ",
          "sort_order": 0,
          "value": "",
          "_id": "5df37c50854df50b274d7829"
        }
      }
    ]
  }
]

如您所见,每个value _id来自 Array Two 中索引 1 处的元素匹配每个 value _id来自Array One .

如何迭代 Array Two并提取 _id如果所有元素value _id的比赛 Array One

我尝试了很多方法,但似乎都不起作用,例如:

    const opts = newTempProduct.variants.map((item) => item.options);
    const props = ['_id'];
    const result = opts
      .filter((o1, i) => {
        o1.filter((o3) => {
          return tmpVariant.some((o2) => {
            return o3.value._id === o2.value._id;
          });
        });
      })
      .map(function(o) {
        return props.reduce((newo, name) => {
          newo[name] = o[name];
          return newo;
        }, {});
      });

最佳答案

您可以创建一个名为 search 的附加数组。该数组是第一个数组的映射版本,仅包含 _id 属性。为了提高效率,您可以将此数组设置为 Set,这样您就可以进行 O(1) 查找。然后,您可以将 .every().filter() 一起使用,如果 options 中的所有 id 都返回 true给定对象的数组位于 search 数组中。这将为您提供最终的 ID:

const arr = [{ "value": { "_id": "5ce3f8cc35ad1e0999ee18d1", "is_default": false, "is_required": true, "sort_order": 0, "value": "", "label": "No 38", "option_id": "5ce3f8cc35ad1e0999ee18d0", "__v": 0, "selected": true } }, { "value": { "label": "Τρικολορ", "sort_order": 0, "value": "#7a3131|#0e8e76|#b6edd9", "_id": "3aa5b2d7-cb78-44ce-bb5d-e4d42ebf3309", "selected": true } }, { "value": { "label": "ΧΛ", "sort_order": 0, "value": "", "_id": "5df37c50854df50b274d7829", "selected": true } } ]; 
const data = [{ "_id": "5df384edba99411550e4e019", "options": [{ "option": { "sort_order": 0, "display_name": "Μέγεθος (EU)", "type": "text", "display_style": "dropdown" }, "value": { "_id": "5ce3f8cc35ad1e0999ee18d1", "is_default": false, "is_required": true, "sort_order": 0, "value": "", "label": "No 38", "option_id": "5ce3f8cc35ad1e0999ee18d0", "__v": 0 } }, { "option": { "display_name": "swatch", "display_style": "swatch", "sort_order": 0, "type": "swatch" }, "value": { "label": "Τρικολορ", "sort_order": 0, "value": "#7a3131|#0e8e76|#b6edd9", "_id": "3aa5b2d7-cb78-44ce-bb5d-e4d42ebf3309" } }, { "option": { "display_name": "dropdown", "display_style": "dropdown", "sort_order": 0, "type": "multiplechoice" }, "value": { "_id": "5df37c61854df50b274d782a", "is_default": false, "is_required": true, "label": "Λ", "sort_order": 0, "value": "", "value_data": null } } ] }, { "_id": "5ce3f8cc35ad1e0999ee18d1", "options": [{ "option": { "sort_order": 0, "display_name": "Μέγεθος (EU)", "type": "text", "display_style": "dropdown" }, "value": { "_id": "5ce3f8cc35ad1e0999ee18d1", "is_default": false, "is_required": true, "sort_order": 0, "value": "", "label": "No 38", "option_id": "5ce3f8cc35ad1e0999ee18d0", "__v": 0 } }, { "option": { "display_name": "swatch", "display_style": "swatch", "sort_order": 0, "type": "swatch" }, "value": { "label": "Τρικολορ", "sort_order": 0, "value": "#7a3131|#0e8e76|#b6edd9", "_id": "3aa5b2d7-cb78-44ce-bb5d-e4d42ebf3309" } }, { "option": { "display_name": "dropdown", "display_style": "dropdown", "sort_order": 0, "type": "multiplechoice" }, "value": { "label": "ΧΛ", "sort_order": 0, "value": "", "_id": "5df37c50854df50b274d7829" } } ] } ];

const search = new Set(arr.map(({value: {_id}}) => _id));
const res = data.filter(
  ({options}) => options.every(({value: {_id}}) => search.has(_id))
).map(({_id}) => _id); // use `.filter()` incase many objects match ur first array

console.log(res); // array of all _ids matched
console.log(res.pop()); // your expected/wanted result

关于javascript - 通过 _id 匹配并提取两个对象数组之间的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59323941/

相关文章:

javascript - JavaScript 中的重复变量

java - 如何检查数组中是否有重复的数字?

javascript - 在排序数组中进行线性搜索,增量为 2 而不是 1

java - 如何使用循环通过用户输入获取部分数组元素

java - Java Arrays.binarySearch 方法的 C 实现

javascript - jQuery toggleClass 不工作?

c# - 如何显示用户时区的时间?

javascript - 使用 <title> 标签内容填充 <input> 元素

javascript - 为 SlideToggle JQuery 选择多个 id

c++ - 在主程序或函数子程序中使用数组的区别