比较2个数组并替换匹配键中的值
Compare 2 arrays and replace values from keys that match?
这是我的尝试。
问题:
当前我的return ds1.locale = dataSrc2[i][property]
线路是一个故障点我知道map返回一个新数组;但是,除了ds1.locale
的值之外,我想要原始dataSrc1
的属性和值。
问题:如何在继承dataSrc1
的原始其他键值对的同时返回数组,dataSrc1.locale
除外,该值被匹配的dataSrc2
键值替换。
UPDATE我解决了它。但代码真的很难看。有更好的方法吗?也许不用3个该死的循环?
以下是步骤的伪代码。
//1. loop over dataSrc1.
//2. loop over dataSrc2.
//3. try find a match from dataSrc2[key] e.g. dataSrc2['af'] === dataSrc1.locale;
//4. if matched save dataSrc2's key
//5. replace dataSrc1.language = dataSrc2[savedDataSrc2Key]
var dataSrc1 = [{'locale': 'af', 'language': 'Afrikaans'}, {'locale': 'ar', 'language': 'Arabic'}];
var dataSrc2 = [{'ar': '丹麥文'},{'af': '土耳其文'}];
//Intended output
//dataSrc3 = [{'locale': 'af', 'language': '土耳其文'}, {'locale': 'ar', 'language': '丹麥文'}]
Repl代码
var dataSrc3 = dataSrc1.map(function(ds1){
for(var i = 0; i < dataSrc2.length; i += 1){
for (var property in dataSrc2[i]) {
if (dataSrc2[i].hasOwnProperty(property)) {
if(property === ds1.locale){
ds1.language = dataSrc2[i][property];
return ds1;
}
}
}
}
})
console.log(dataSrc3);
//Current output
//[ '土耳其文', '丹麥文' ]
//Intended output
//dataSrc3 = [{'locale': 'af', 'language': '土耳其文'}, {'locale': 'ar', 'language': '丹麥文'}]
您可以进行一点重构:
var dataSrc3 = dataSrc1.map(function(d1) {
var language = null;
// .some will iterate until you return true or last item is passed
// set variable language to found language
dataSrc2.some(function(d) {
if (Object.prototype.hasOwnProperty.call(d, d1.locale)) {
language = d[d1.locale];
return true;
}
});
// return a new object, this will not modify the objects in dataSrc1 and dataSrc2
return { language: language, locale: d1.locale };
});
console.log(dataSrc3); // [{'locale': 'af', 'language': '土耳其文'}, {'locale': 'ar', 'language': '丹麥文'}]
有一种叫做.find
的实验数组方法,它的工作原理有点像.some
,但会给你数组中的当前值:
var dataSrc3 = dataSrc1.map(function(d1) {
var d2 = dataSrc2.find(function(d2) {
return Object.prototype.hasOwnProperty.call(d2, d1.locale);
});
// return a new object, this will not modify the objects in dataSrc1 and dataSrc2
return {
language: d2[d1.locale],
locale: d1.locale
};
});
console.log(dataSrc3); // [{'locale': 'af', 'language': '土耳其文'}, {'locale': 'ar', 'language': '丹麥文'}]
你可能想看看undercore.js或lodash。这些库将提供可用于旧浏览器的实用util函数:
var dataSrc3 = _.map(dataSrc1, function(d1) {
var d2 = _.find(dataSrc2, function(d2) {
return _.has(d2, d1.locale);
});
return {
language: d2[d1.locale],
locale: d1.locale
};
});
我们的代码中有两个错误:
return ds1.locale = dataSrc2[i][property];
这将分配给并返回ds1.locale
,而您希望分配给ds1.language
,并返回修改后的ds1
:
ds1.language = dataSrc2[i][property];
return ds1;
其次,您还应该返回任何未修改的ds1
,因此在for
循环之后添加:
return ds1;
正如其他人所指出的,您可以更简洁地编写函数。
相关文章:
- 如何使用 node.js 比较两个 json 数组
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- MongoDB (php) - 以数组而不是多个属性的形式返回文档属性
- 在数组中的一个元素上设置多个值
- 访问$.ajax()函数中的两个不同数组
- 在对象数组中查找多个值的d3范围
- 正在更新mongod中两个对象内部的数组
- 如何循环通过2个对象数组并通过匹配id进行合并
- 如何使用javascript合并两个对象数组
- 使用filter和map方法将数组中某些元素的第一个字母大写-JavaScript
- 第一个字第一个字符第二个字第二个字符,一直到数组结束
- 在数组JS中查找三个重复项
- 我正在尝试使用多个2数组来绑定svg圆的数据,但不知道如何绑定
- JS:从整个数组中每次得到5个项目,并得到平均值
- 带有多个答案选项的Javascript动态数组窗口
- 使用数据数组创建多个类似组件
- 如何从数组中删除几个相同的项
- 根据多个值筛选数组
- 创建具有2个唯一数字的Javascript数组
- 在 JQuery 验证中验证多个“数组命名”文件输入和下拉列表