我想将对象与数组合并,但似乎无法正常工作。
我想合并数组,但通过“标签”保留唯一项。
第一个对象:
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'”,我想保留最后一个...
答案 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>