зацикливание внутри массива объекта? - PullRequest
0 голосов
/ 10 апреля 2020

Моя проблема состоит в том, чтобы обновить массив, содержащий объекты, и каждый объект содержит массив, я хочу обновить глобальный массив, со значениями, относящимися к массиву внутри объектов, эта логика c!

generalArray = [{name:String, features:String[]}]

// Try edit message
let array1 = [{ name: "num", features: ['id']  },
            { name: "cat", features: ['gender'] }];
ob = {name:'num2', features:['id']};

function updateArr(arr,ob){

  const index = arr.findIndex(x => 
      ob.features.toString() === x.features.toString()
                              );
    if (index === -1) {
        arr.push(ob);
    } else {
        arr[index] = ob;
    }
}
console.log(array1);
updateArr(array1,ob);
console.log(array1);

это работает отлично, когда массив объектов любого объекта содержит одну строку, но если он содержит более одной строки, exm features = ['id', 'пол'] это не может сделать что-нибудь ! помогите пожалуйста и спасибо

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020

Вариант 1. Когда порядок элементов в массиве функций не имеет значения.

Вы можете просто изменить оператор сравнения в приведенной ниже строке кода

ob.features.toString() === x.features.toString()

на

JSON.stringify(ob.features.sort()) === JSON.stringify(x.features.sort())

Вариант 2: Если порядок элементов в массиве элементов имеет значение. Тогда вы можете просто удалить .sort().

Примечание: если вы не хотите использовать stringify, тогда вы можете использовать функцию сравнения массивов, как упомянуто здесь в ответе - { ссылка }.

0 голосов
/ 10 апреля 2020

let array1 = [{ name: "num", features: ['id']  },
            { name: "cat", features: ['gender'] }];
ob = {name:'num2', features:['id']};

function updateArr(arr,ob){

  const index = arr.findIndex(x => 
  ob.features.includes(x.features)
     // ob.features.toString() === x.features.toString()
                              );
                              debugger
    if (index === -1) {
        arr.push(ob);
    } else {
        arr[index] = ob;
    }
}
console.log(array1);
updateArr(array1,ob);
console.log(array1);
0 голосов
/ 10 апреля 2020

Здесь я принял решение вашей проблемы

var array1 = [{ name: "num", features: ['id', 'gender']},
            { name: "cat", features: ['gender']}];
ob = {name:'num2', features:['id']};

function updateArr(arr, ob){
  for(var i = 0;i < arr.length; i++) {
    if(ob.features.join("") === arr[i].features.join("")) {
      arr[i] = ob;
      return;
    }
  }
  arr.push(ob);
}

/* you are changing the array, so if you print the array
 before you will get the result of after because it's a
 reference and not literal :)*/
updateArr(array1, ob);
console.log(array1);
...