Замена элемента, который отличается между 2 массивами - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть 2 массива:

var alleditvals= {username: "twooooo", password: "two_p", address: "two_add"};
var a= {username: "two", password: "two_p", address: "two_add"};

Теперь я хочу, чтобы только разность (т. Е. "Twoooo") была заменена на объект a таким образом, чтобы a также стал похож на alleditvals.

На самом деле в моем коде a происходит из массива с именем add_data, поэтому я использую функцию map:

add_data.map((a,i)=>
  i===count_edit ? alleditvals : a
)

здесь count_edit - это просто число, которое я обновляю, и затем я проверяю, совпадает ли индекс add_data с count_edit, затем включаю значение alleditvals, в противном случае сохраняем значение add_data (которое a). Но проблема этого метода в том, что он заменяет каждый объект внутри add_data, если условие выполняется, то есть поля типа password и address также заменяются. поэтому, пожалуйста, предложите метод, в котором я могу выборочно заменить только тот элемент, где произошла смена.

Спасибо.

Ответы [ 4 ]

0 голосов
/ 23 апреля 2019

Если я правильно понимаю ваш вопрос, это может быть хорошим подходом для того, что вы ищете:

var alleditvals= {username: "twooooo", password: "two_p", address: "two_add"};


var a= {username: "two", password: "two_p", address: "two_add"};
var b= {username: "three", password: "two_p", address: "two_add"};
var c= {username: "four", password: "two_p", address: "two_add"};

let add_data=[a,b,c];

for (let x in add_data) {
   if(add_data[x].username!==alleditvals.username){
     add_data[x].username=alleditvals.username
   }
   /* other fields is same:
   if(add_data[x].password!==alleditvals.password){
     add_data[x].password=alleditvals.password
   }
   */
}


console.log(add_data)

Вы можете изменить и запустить этот код с здесь .

0 голосов
/ 23 апреля 2019

Если вы используете современный JavaScript, вы можете достичь этого просто с помощью оператора распространения :

a = { ...alleditvals, ...a }

Теперь a будет иметь все исходные свойства a плюслюбой из alleditvals, который еще не определен a.

Если вместо этого вы хотели, чтобы оба новых значения из alleditvals и заменяли что-либо в a тем же значением пропеллера из alleditvals - то есть слияние по a - затем просто измените порядок:

a = { ...a, ...alleditvals }
0 голосов
/ 23 апреля 2019

Использование Object.assign.

var alleditvals= {username: "twooooo", password: "two_p", address: "two_add"};
var a= {username: "two", password: "two_p", address: "two_add"};

a = Object.assign(a, alleditvals);
0 голосов
/ 23 апреля 2019

Если я правильно вас понимаю, вы не хотите равнять alleditvals, потому что, как сказал Kraylog, в этом случае вы могли бы просто назначить его (за исключением того факта, что тогда все свойства были в a, но не в alleditvals , будет потеряно)

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

for (x in alleditvals) {
    if (x === “username”) {
        a[x] = alleditvals[x];
    }
    // more if x === ... stuff
}

Чтобы действительно выполнить то, что вы просили (перезаписать различия и сохранить свойства a, которые не встречаются в alleditvals), попробуйте что-то вроде:

for (x in alleditvals) {
    if (
        a.hasOwnProperty(x) // to only replace if a contains a key of alleditvals
        && a[x] !== alleditvals[x]
        ) {
        a[x] = alleditvals[x];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...