2016-06-30 6 views
0

У меня очень сложная манипуляция. Так вот оно.Обновление массива объектов с другим массивом данных объектов

У меня есть массив объектов с именем «data1»

[Object, Object, Object] 
     0:Object 
       id="00456145"  //check this 
       name: "Rick" 
       upper:"0.67" 
       lower:"-0.34" 
     1:Object 
       id="00379321"  
       name:"Anjie" 
       upper:"0.46" 
       lower:"-0.56" 
     2:Object 
       id="00323113"  
       name:"dillan" 
       upper:"0.23" 
       lower:"-0.11" 

Я заинтересован только в идентификатор, верхних и нижних значений из этих массива объектов.

Вот второй массив объектов, названных «data2»

[Object, Object] 
    0:Object 
      id="0045614" //present here if we remove last element of '00456145' 
      cast="Rick" 
      Contact: "Yes" 
      upper:"0.11" //need to be updated to '0.67' 
      lower:"-0.11" //need to be updated to '-0.34' 
    1:Object 
      id="0032311"  //present here if we remove last element of '00323113' 
      cast:"dillan" 
      Contact:"Maybe" 
      upper:"0.11" 
      lower:"-0.11" 

Итак, это то, что я должен делать. Сначала я проверю 'data1'. id, присутствующий в 'data1'. Напр. объект 0 имеет id = "00456145"

Я удаляю последнее число, присутствующее в нем. поэтому он становится id = "0045614". Тогда я сравниваю, если этот идентификатор присутствует в объекте 'data2'.

Если он присутствует, верхние и нижние значения, присутствующие для этого объекта 0 в 'data1', передаются объекту 'data2', где присутствует идентификатор. В этом случае объект 0 'data2' имеет id = '0045614'.

Таким образом, верхние и нижние значения будут обновлены до 0,67 и -0,34 соответственно.

Аналогичным образом для других массивов. Таким образом, окончательный результат должен выглядеть следующим образом из «data2»

[Object, Object] 
    0:Object 
      id="0045614" 
      cast="Rick" 
      Contact: "Yes" 
      upper:"0.67" //updated 
      lower:"-0.34" //updated 
    1:Object 
      id="0032311" 
      cast:"dillan" 
      Contact:"Maybe" 
      upper:"0.23"  //updated 
      lower:"-0.11"  //updated 

ответ

1

Возможно, это то, что вы хотите.

var data1 = [{ 
 
    id: "00456145", 
 
    name: "Rick", 
 
    upper: "0.67", 
 
    lower: "-0.34" 
 
}, { 
 
    id: "00379321", 
 
    name: "Anjie", 
 
    upper: "0.46", 
 
    lower: "-0.56" 
 
}, { 
 
    id: "00323113", 
 
    name: "dillan", 
 
    upper: "0.23", 
 
    lower: "-0.11" 
 
}]; 
 

 
var data2 = [{ 
 
    id:"0045614", 
 
    cast:"Rick", 
 
    Contact: "Yes", 
 
    upper:"0.11", 
 
    lower:"-0.11", 
 
}, { 
 
    id:"0032311", 
 
    cast:"dillan", 
 
    Contact:"Maybe", 
 
    upper:"0.11", 
 
    lower:"-0.11", 
 
}]; 
 

 

 
data2.forEach(function(data2Value) { 
 
    data1.forEach(function(data1Value) { 
 
    if(data1Value.id.substr(0, data1Value.id.length - 1) === data2Value.id) { 
 
     data2Value.upper = data1Value.upper; 
 
     data2Value.lower = data1Value.lower; 
 
    } 
 
    }); 
 
}); 
 

 
console.log(data2);

1

Вы можете попробовать что-то вроде этого:

for (var i = 0; i < data1.length; i++) { 
    var item = data1[i]; 
    var trim = item.id.substr(0, item.id.length - 1); 
    for (var j = 0; j < data2.length; j++) { 
    var item2 = data2[j]; 
    if (item2.id === trim) { 
     item2.upper = item.upper; 
     item2.lower = item.lower; 
    } 
    } 
} 

и если вы используете ES6 вы можете упростить программный код:

for (let item of data1) { 
    let trim = item.id.substr(0, item.id.length - 1); 
    for (let item2 of data2) { 
    if (item2.id === trim) { 
     item2.upper = item.upper; 
     item2.lower = item.lower; 
    } 
    } 
} 
1

Решение проблемы с использованием Array.prototype.forEach. Петля через объекты data2, и если идентификатор совпадает с любым объектом в data1, обновите значения с помощью соответствующего.

var data1 = [{ 
    id: "00456145", 
    name: "Rick", 
    upper: "0.67", 
    lower: "-0.34" 
    }, { 
    id: "00379321", 
    name: "Anjie", 
    upper: "0.46", 
    lower: "-0.56" 
    }, { 
    id: "00323113", 
    name: "dillan", 
    upper: "0.23", 
    lower: "-0.11" 
    }]; 

    var data2 = [{ 
    id: "0045610", //present here if we remove last element of '00456145' 
    cast: "Rick", 
    Contact: "Yes", 
    upper: "0.11", //need to be updated to '0.67' 
    lower: "-0.11" //need to be updated to '-0.34' 
    }, { 
    id: "0032311", //present here if we remove last element of '00323113' 
    cast: "dillan", 
    Contact: "Maybe", 
    upper: "0.11", 
    lower: "-0.11" 
    }]; 

data2.forEach(function(item2){ 
    data1.forEach(function(item1){ 
    if (item1.id.substring(0,7) === item2.id){ // can be `item1.id.indexOf(item2.id) == 0 
    item2.upper = item1.upper; 
    item2.lower = item1.lower; 
    } 
    }); 
}); 

console.log(data2); 
+0

делает эту работу? функция (item2) и функция (item1). немного запутанные в отношении wat - это те, которые ссылаются на – Patrick

+1

forEach, цикл будет перебирать элементы/объекты массива. Таким образом, с каждой итерацией объект из массива передается на анонимную функцию обратного вызова. item2 - это объект из массива data2, а item1 - объект из daat1. –

1

Вы можете использовать что-то вроде

data1.forEach(function(obj) { 
     var search = obj.id.slice(0, -1); 
     data2.forEach(function(d) { 
      if (d.id === search) { 
       d.upper = obj.upper; 
       d.lower = obj.lower; 
      }; 
     }); 
    }); 

, чтобы сделать это.

+0

hecotr, wat являются obj и d в функции(), которую вы упомянули. – Patrick

+1

Это индивидуальные объекты вашего массива. obj даст объект с индексом 0, 1, 2 соответственно на каждой итерации цикла forEach. Аналогично, d дает вам доступ к отдельным объектам данных массива2. –

2

Мне нравится array#some в этом случае, так что вы можете выйти из цикла, так что нет ненужных повторений:

var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34" }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56" }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }]; 
 
var data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11" }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }]; 
 

 
data2 = data2.map(function(item) { 
 
    data1.some(function(a) { 
 
    if (item.id == a.id.slice(0, -1)) { 
 
     item.upper = a.upper; 
 
     item.lower = a.lower; 
 
     return true; 
 
    } 
 
    }); 
 

 
    return item; 
 
}); 
 

 
console.log(data2);

2

I предложите использовать либо объект как хеш-таблицу, либо карту. Тогда нужны только две петли, одна для получения ссылок и одна для назначений.

Big O: O (п + т)

В то время как я на самом деле не знаю, какой из них (Map против Object) больше подходит, вы можете получить свой собственный рисунок:

Предложение с Object

var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34", }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56", }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }], 
 
    data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11", }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }], 
 
    hash = Object.create(null); 
 

 
data1.forEach(function (a) { 
 
    hash[a.id.slice(0, -1)] = a; 
 
}); 
 

 
data2.forEach(function (a) { 
 
    var o = hash[a.id]; 
 
    o && Object.keys(o).forEach(function (k) { 
 
     if (k !== 'id' && a[k] !== o[k]) { 
 
      a[k] = o[k]; 
 
     } 
 
    }); 
 
}); 
 

 
console.log(data2);

Предложение с Map

var data1 = [{ id: "00456145", name: "Rick", upper: "0.67", lower: "-0.34", }, { id: "00379321", name: "Anjie", upper: "0.46", lower: "-0.56", }, { id: "00323113", name: "dillan", upper: "0.23", lower: "-0.11" }], 
 
    data2 = [{ id: "0045614", cast: "Rick", Contact: "Yes", upper: "0.11", lower: "-0.11", }, { id: "0032311", cast: "dillan", Contact: "Maybe", upper: "0.11", lower: "-0.11" }], 
 
    map = new Map; 
 

 
data1.forEach(function (a) { 
 
    map.set(a.id.slice(0, -1), a); 
 
}); 
 

 
data2.forEach(function (a) { 
 
    var o = map.get(a.id); 
 
    o && Object.keys(o).forEach(function (k) { 
 
     if (k !== 'id' && a[k] !== o[k]) { 
 
      a[k] = o[k]; 
 
     } 
 
    }); 
 
}); 
 

 
console.log(data2);

Смежные вопросы