Замена элемента, который отличается между 2 массивами

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

У меня есть 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 , также заменяются. поэтому, пожалуйста, предложите метод, при котором я могу выборочно заменить только тот элемент, в котором произошло изменение.

Спасибо.

Комментарии:

1. У вас есть список всех свойств, которые необходимо заменить, или свойств, которые следует исключить?

2. Во-первых, это не массивы. Во-вторых, если вам нужно a равняться alleditvals , почему бы не назначить его? a = alleditvals ?

3. @Kraylog Он сказал, что не хочет заменять свойства пароля и адреса.

4. @Barmar xyproblem.info

5. Я не понимаю, я могу выборочно заменить только тот элемент, в котором произошло изменение. Если вы замените свойства, в которых не произошло никаких изменений, в чем разница? Это все то же самое.

Ответ №1:

Если я вас правильно понимаю, вы не хотите, чтобы a равнялся alleditvals, потому что, как сказал Крайлог, в этом случае вы могли бы просто назначить его (за исключением того факта, что тогда все свойства, которые были в 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
        amp;amp; a[x] !== alleditvals[x]
        ) {
        a[x] = alleditvals[x];
    }
}
  

Ответ №2:

Используйте 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);
  

Ответ №3:

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

 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)
  

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

Ответ №4:

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

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

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

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

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