鍍金池/ 問答/HTML/ 數(shù)組比較,用新數(shù)組覆蓋老數(shù)組值

數(shù)組比較,用新數(shù)組覆蓋老數(shù)組值

//老數(shù)組
{form_id: 1, field_id: 10, data: "215", member_id: 101}
{form_id: 12, field_id: 2, data: "215212", member_id: 101}
{form_id: 2, field_id: 31, data: "123", member_id: 101}
//新數(shù)組
{form_id: 2, field_id: 31, data: "123321", member_id: 101}

需求:
在老數(shù)組中找出form_id、field_id、member_id值與新數(shù)組對應(yīng)值相同的數(shù)組,然后用新數(shù)組中data的值替換老數(shù)組的值。

感謝~~

回答
編輯回答
蝶戀花

提供一個思路。如果數(shù)組元素比較少,可以窮舉遍歷,三層循環(huán),復(fù)雜度較高。
如果數(shù)組元素比較多,可以考慮用空間換時間。將新數(shù)組轉(zhuǎn)成容易查找的數(shù)據(jù)結(jié)構(gòu),比如多維數(shù)組,多層map,樹,等,然后遍歷老數(shù)組,一邊遍歷一邊比較,找到一個就設(shè)置,找不到就跳過

2017年9月23日 00:23
編輯回答
陪妳哭

方法一,直接遍歷搜尋

//老數(shù)組
const olds = [
    { form_id: 1, field_id: 10, data: "215", member_id: 101 },
    { form_id: 12, field_id: 2, data: "215212", member_id: 101 },
    { form_id: 2, field_id: 31, data: "123", member_id: 101 }
];

//新數(shù)組
const news = [
    { form_id: 2, field_id: 31, data: "123321", member_id: 101 }
];


function itemEquals(a, b) {
    return a.form_id === b.form_id
        && a.field_id === b.field_id
        && a.member_id === b.member_id
}

// 遍歷舊數(shù)據(jù),對每個元素去遍歷新數(shù)組,查找是否有對應(yīng)數(shù)據(jù)
olds.forEach(item => {
    const found = news.find(n => itemEquals(n, item));
    if (found) {
        item.data = found.data;
    }
});

console.log(olds);

上面的方面在新數(shù)據(jù)較大的時候,查詢效率會比較低,那就可以采用拼接唯一ID的方法來處理


// 根據(jù)幾個屬性生成唯一鍵,注意間隔字符的選中,一定不能造成歧義
function unique(item) {
    return `${item.form_id}-${item.field_id}-${item.member_id}`;
}

const dict = news.reduce((dict, item) => {
    dict[unique(item)] = item;
    return dict;
}, {});


olds.forEach(item => {
    const found = dict[unique(item)];
    if (found) {
        item.data = found.data
    }
});
2018年7月17日 18:25
編輯回答
久舊酒

貌似沒什么特殊的哈,嵌套一個循環(huán)不就好了

var arr = [
    {k:1,v:'1'},
    {k:2,v:'2'},
    {k:3,v:'3'}
]
var narr = [
    {k:2,v:'22'},
    {k:3,v:'33'}
]
narr.forEach(n=>{
    arr.forEach(o=>{
        if(o.k == n.k){
            o.v = n.v
        }
    })
})
console.log(arr);
2018年7月19日 00:57
編輯回答
不歸路
let oldArray = [
  {form_id: 1, field_id: 10, data: "215", member_id: 101},
  {form_id: 12, field_id: 2, data: "215212", member_id: 101},
  {form_id: 2, field_id: 31, data: "123", member_id: 101}
];

let newArray = [{form_id: 2, field_id: 31, data: "123321", member_id: 101}];

for (let i = 0; i < oldArray.length; i++) {
  for (let a of newArray) {
    const o = oldArray[i];
    if (o.form_id === a.form_id && o.field_id === a.field_id && o.member_id === a.member_id) {
      oldArray[i].data = a.data;
    }
  }
}

console.log(oldArray);

輸出:

[ { form_id: 1, field_id: 10, data: '215', member_id: 101 },
  { form_id: 12, field_id: 2, data: '215212', member_id: 101 },
  { form_id: 2, field_id: 31, data: '123321', member_id: 101 } ]
2018年4月27日 09:50