合并对象与数组

时间:2019-10-25 14:28:38

标签: javascript lodash

我想将对象与数组合并,但似乎无法正常工作。

我想合并数组,但通过“标签”保留唯一项。

第一个对象:

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'”,我想保留最后一个...

2 个答案:

答案 0 :(得分:0)

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

https://esqa.moneris.com/HPPDP/index.php?

这样,编辑键现在将保存此对象数组,

const uri = `https://esqa.moneris.com/HPPDP/index.php?hpp_id=${preloadResponse.hpp_id}&hpp_preload&ticket=${preloadResponse.ticket}`;

<WebView source={{ uri }} />

答案 1 :(得分:0)

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

const fn = (key, ...objs) => _.mergeWith({}, ...objs, (v1, v2) => {
  if(!_.isArray(v1)) return;
  
  /** convert both arrays to objects indexed by the chosen key, 
      merge them using the fn (this will handle arrays inside arrays)
      and then convert back to array with _.values() **/
  return _.values(fn(key, _.keyBy(v1, key), _.keyBy(v2, key)));
});

const 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"}]};

const object2 = {"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"}]};

const result = fn('label', object1, object2);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

ES5版本:

function fn(key, arr1, arr2) {
  return _.mergeWith({}, arr1, arr2, function(v1, v2) {
    if(!_.isArray(v1)) return;

    /** convert both arrays to objects indexed by the chosen key, 
        merge them using the fn (this will handle arrays inside arrays)
        and then convert back to array with _.values() **/
    return _.values(fn(key, _.keyBy(v1, key), _.keyBy(v2, key)));
  });
}

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 = {"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"}]};

var result = fn('label', object1, object2);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

相关问题