【问题标题】:Merge arrays of objects by condition按条件合并对象数组
【发布时间】:2021-02-21 09:55:31
【问题描述】:

假设我有一组对象 - 原始项目

originalItems = [
   {name:"aaa", expanded: false, visible: true},
   {name:"bbb", expanded: false, visible: true},
   {name:"ccc", expanded: false, visible: true}
]

然后我对项目进行一些更改

currentItems = [
   {name:"aaa", expanded: true, visible: false},
   {name:"bbb", expanded: false, visible: true},
   {name:"ccc", expanded: true, visible: true}
]

现在我需要合并这两个数组,

但是:在合并数组(结果)中,我需要 expanded 值来自 currentItems,并且 visible 将来自 originalItems 像这样的

result = [
   {name:"aaa", expanded: true, visible: true},
   {name:"bbb", expanded: false, visible: true},
   {name:"ccc", expanded: true, visible: true}
]

有什么优雅的方法可以实现吗?还是只通过属性?

【问题讨论】:

  • currentItems 的顺序是否与originalItems 相同?
  • 是的,顺序一样

标签: javascript arrays


【解决方案1】:

您可以在其中一个数组(例如原始数组)上使用.map(),并通过将原始对象 (...) 的属性传播到一个新对象来将每个对象转换为一个新对象。然后,您可以设置 expanded 属性以通过索引 (i) 从 currentItems 中的相应对象中获取值。请参见下面的示例:

const originalItems = [ {name:"aaa", expanded: false, visible: true}, {name:"bbb", expanded: false, visible: true}, {name:"ccc", expanded: false, visible: true} ];
const currentItems = [ {name:"aaa", expanded: true, visible: false}, {name:"bbb", expanded: false, visible: true}, {name:"ccc", expanded: true, visible: true} ];

const res = originalItems.map((obj, i) => ({
  ...obj,
  expanded: currentItems[i].expanded
}));

console.log(res);

【讨论】:

    【解决方案2】:

    为了简单和速度,我会像这样对数组进行排序和管理。也许更符合您的预期。

    let Items = [
        { name: "aaa", expanded: false, visible: true },
        { name: "bbb", expanded: false, visible: true },
        { name: "ccc", expanded: false, visible: true }
    ]
    
    
    
    function doExpand(name, val) {
        let item = getItem(name);
        item.expanded = val;
    }
    function doVisible(name, val) {
        let item = getItem(name);
        item.visible = val;
    }
    function addItem(name) {
        if (!getItem(name)) {
            Items.push({ name: name, expanded: false, visible: false });
        } else {
            console.log("duplicates found");
        }
    }
    
    function getItem(name) {
        for (let i = 0; i < Items.length; i++) {
            if (Items[i].name === name) return Items[i];
        }
        return false;
    }
    
    /* TESTING TIME */
    
    doExpand("aaa", true);
    doExpand("aaa", false);
    let Item = getItem("bbb");
    Item.name = "renamed";
    addItem("dogsnacks");
    addItem("bacon");
    addItem("programming");
    addItem("programming");
    addItem("programming");
    addItem("programming");
    addItem("programming");
    
    console.log(Items);

    【讨论】:

    • For 比 Map 快;如果目标是有效的,作为提醒。
    【解决方案3】:

    由于您要从两个相同长度的不同数组中获取元素来创建第三个,因此您可以创建一个新数组,然后遍历数组中的对象数量,根据所需的源构造您的结果对象列表。

    let result = [];
    for (i = 0; i < originalItems.length; i++) {
      let newObj = {
        name: originalItems[i].name,
        expanded: currentItems[i].expanded,
        visible: originalItems[i].visible,
      };
      result.push(newObj);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2011-04-04
      • 2015-12-05
      • 1970-01-01
      相关资源
      最近更新 更多