Javascript 将对象与数组合并

Javascript 将对象与数组合并,javascript,lodash,Javascript,Lodash,我想将对象与数组合并,但它似乎没有按预期工作 我希望使用concat数组,但通过“标签”保留唯一项 第一个对象: var object1 = { index: [ { label: 'Ajouter', url: '/_add/:model', icon: 'add', isMain: true }, { label: 'Exporter en CSV', url: '/_export/:mode

我想将对象与数组合并,但它似乎没有按预期工作

我希望使用concat数组,但通过“标签”保留唯一项

第一个对象:

var object1 = {
  index: [
    {
      label: 'Ajouter',
      url: '/_add/:model',
      icon: 'add',
      isMain: true
    },
    {
      label: 'Exporter en CSV',
      url: '/_export/:model',
      icon: 'cloud_download'
    },
    {
      label: 'Accès à l\'API',
      url: '/api/_index/:model',
      target: '_blank',
      icon: 'link'
    }
  ],
  add: [
    {
      label: 'Retour',
      url: '/_index/:model',
      icon: 'arrow_back'
    }
  ],
  edit: [
    {
      label: 'Retour',
      icon: 'arrow_back',
      url: '/_index/:model'
    },
    {
      label: 'Supprimer',
      icon: 'delete',
      url: '/_delete/:model/:id'
    }
  ]
};
var object2 = _.mergeWith(_.clone(object1), {
  index: [
    {
      label: 'Explorateur ',
      url: '/file/_folder-explorer/uploads',
      target: '_blank',
      icon: 'folder_open'
    },
    {
      label: 'Ajout multiple ',
      url: '/file/_add-multiple',
      icon: 'library_add'
    }
  ],
  edit: [
    {
      label: 'Retour',
      icon: 'arrow_back',
      url: '/file/_index'
    }
  ]
}, customizerMergeActions);

function customizerMergeActions(objValue, srcValue) {
  if (_.isArray(objValue)) {
    return objValue.concat(srcValue);
  }
}
第二个对象:

var object1 = {
  index: [
    {
      label: 'Ajouter',
      url: '/_add/:model',
      icon: 'add',
      isMain: true
    },
    {
      label: 'Exporter en CSV',
      url: '/_export/:model',
      icon: 'cloud_download'
    },
    {
      label: 'Accès à l\'API',
      url: '/api/_index/:model',
      target: '_blank',
      icon: 'link'
    }
  ],
  add: [
    {
      label: 'Retour',
      url: '/_index/:model',
      icon: 'arrow_back'
    }
  ],
  edit: [
    {
      label: 'Retour',
      icon: 'arrow_back',
      url: '/_index/:model'
    },
    {
      label: 'Supprimer',
      icon: 'delete',
      url: '/_delete/:model/:id'
    }
  ]
};
var object2 = _.mergeWith(_.clone(object1), {
  index: [
    {
      label: 'Explorateur ',
      url: '/file/_folder-explorer/uploads',
      target: '_blank',
      icon: 'folder_open'
    },
    {
      label: 'Ajout multiple ',
      url: '/file/_add-multiple',
      icon: 'library_add'
    }
  ],
  edit: [
    {
      label: 'Retour',
      icon: 'arrow_back',
      url: '/file/_index'
    }
  ]
}, customizerMergeActions);

function customizerMergeActions(objValue, srcValue) {
  if (_.isArray(objValue)) {
    return objValue.concat(srcValue);
  }
}

问题:在“编辑”键中,我得到了相同的对象“label:'Retour'”,我想保留最后一个…

如果我答对了你的问题,你想用object1变量中的相应值覆盖源对象的值,即(与函数合并的第二个参数)。因此,与其在customizerMergeActions函数中使用concat函数,不如使用

function customizerMergeActions(objValue, srcValue) {
    if (_.isArray(objValue)) {
        return _.merge(objValue, srcValue);
    }
}
这样,“编辑”键现在将保存此对象数组

[
    {label: "Retour", icon: "arrow_back", url: "/file/_index"},
    {label: "Supprimer", icon: "arrow_back", url: "/_delete/:model/:id"}
]

如果要组合两个数组,需要将它们都转换为对象,并使用
标签的值作为每个数组的键。然后合并它们,并转换回数组

const-fn=(key,…objs)=>ux0.mergeWith({},…objs,(v1,v2)=>{
如果(!.isArray(v1))返回;
/**将两个数组转换为由所选键索引的对象,
使用fn合并它们(这将处理数组中的数组)
然后再转换回带有u.values()的数组**/
返回值(fn(键、.keyBy(v1,键)、.keyBy(v2,键));
});
const object1={“index”:[{“label”:“ajour”,“url”:“/\u add/:model”,“icon”:“add”,“isMain”:true},{“label”:“Exporter en CSV”,“url”:“/\u export/:model”,“icon”:“cloud\u download”},{“label”:“Accèsèl'API”,“url”:“/\API/”index/:model”,“target”,“target”:“\u blank”,“icon”:“link”;“link”],“add:[{“label”:“label”:“label”:“label”:“label”:“label”:“返回”箭头”;“编辑”{“返回”、“图标”:“返回箭头”、“url”:“/\u index/:model”}、{“标签”:“供应商”、“图标”:“删除”、“url”:“/\u delete/:model/:id”});
const object2={“index”:[{“label”:“Explorateur”,“url”:“/file/\u folder-explorer/uploads”,“target”:“\u blank”,“icon”:“folder\u open”},{“label”:“Ajout multiple”,“url”:“/file/\u add-multiple”,“icon”:“library/\u add”}],“edit”:[{“label”:“Retour”,“icon”:“arrow\u back”,“url”:“/file/\u index”}];
const result=fn('label',object1,object2);
console.log(结果);
。作为控制台包装{最大高度:100%!重要;顶部:0;}

它在控制台中工作,但您能否提供JavaScript代码而不是函数的ES5或ES6代码。我使用的是NodeJS,而不是最新版本。已更新。下次-在您的问题中说明ES5。