Javascript цикл через массив объектов и возвращает один объект, содержащий только ключи, значения которых были изменены - PullRequest
1 голос
/ 05 июня 2019

У меня есть массив объектов, которые мне нужно перебрать и проверить, имеет ли ключ объекта другое значение.Если это так, верните этот ключ.

const arrayOfObjects = [
  { item: { first_name: "Joe", last_name: "Dow", age: 15 } },
  { item: { first_name: "Joe", last_name: "d", age: 15 } },
  { item: { first_name: "Joe", last_name: "Dow", age: 20 } }
];

ожидаемый результат должен быть

const result = {
  last_name: true,
  age: true
}

PS: у каждого объекта всегда одинаковое количество ключей

Ответы [ 5 ]

3 голосов
/ 05 июня 2019

Вы можете перебрать arrayOfObjects. Проверьте, имеют ли текущие ключи item значение, отличное от значения item предыдущего объекта. Если да, установите этот ключ на true в result

const arrayOfObjects = [{ item: { first_name: "Joe", last_name: "Dow", age: 15 } }, { item: { first_name: "Joe", last_name: "d", age: 15 } }, { item: { first_name: "Joe", last_name: "Dow", age: 20 } }];
const result = {};

arrayOfObjects.forEach(({ item }, i, arr) => {
  if (i === 0) return; // skip the first item
  
  const prev = arr[i - 1].item; // get the previous item
  for (const key in item) {
    if (item[key] !== prev[key])
      result[key] = true
  }
})

console.log(result)
1 голос
/ 05 июня 2019

Просто используйте find.Это понятнее

const data = [
    { item: { first_name: "Joe", last_name: "Dow", age: 15 } },
    { item: { first_name: "Joe", last_name: "d", age: 15 } },
    { item: { first_name: "Joe", last_name: "Dow", age: 20 } }
];

let result = {};

for (var key in data[0].item) {
  if (data.find((el) => el.item[key] !== data[0].item[key])) {
    result[key] = true;
  }
}
console.log(result);
0 голосов
/ 05 июня 2019

Вы также можете решить эту проблему с помощью Array.reduce и Установите , где вы будете группировать по ключу и продолжать добавлять значения.Затем отфильтруйте по размеру набора ... если больше 1, у вас было более одного значения:

const data = [ { item: { first_name: "Joe", last_name: "Dow", age: 15 } }, { item: { first_name: "Joe", last_name: "d", age: 15 } }, { item: { first_name: "Joe", last_name: "Dow", age: 20 } } ];

let result = data.reduce((r,{item},i,a) => {
 Object.keys(item).forEach(k => r[k] = (r[k] || new Set()).add(item[k]))	
 return i == (a.length-1) 
 ? Object.keys(r).filter(k => r[k].size > 1).reduce((r,k) => (r[k] = true, r), {})
 : r
}, {})

console.log(result)
0 голосов
/ 05 июня 2019

Вот решение, которое сохраняет флаг уникальности, отфильтровывает любые уникальные элементы, отображает их в желаемый формат и создает объект из результирующих записей. Временная сложность: O (n * length_of_item_with_most_keys), пространственная сложность: O (n).

const arrayOfObjects = [
  { item: { first_name: "Joe", last_name: "Dow", age: 15 } },
  { item: { first_name: "Joe", last_name: "d", age: 15 } },
  { item: { first_name: "Joe", last_name: "Dow", age: 20 } }
];

const result = Object.fromEntries(
  Object.entries(arrayOfObjects.reduce((a, e) => {
    for (const k in e.item) {
      if (!a[k]) {
        a[k] = {val: e.item[k], unique: true};
      }
      else if (a[k].unique) {
        a[k].unique = a[k].val === e.item[k];
      }
    }

    return a;
  }, {})
).filter(e => !e[1].unique).map(e => [e[0], true]));

console.log(result);
0 голосов
/ 05 июня 2019

Вы можете взять проверку, которая смотрит на вложенный объект.

function check(source, target, result) {
    Object.entries(source).forEach(([k, v]) => {
        if (v && typeof v === 'object') return check(v, target[k], result);
        if (result[k] === undefined) result[k] = true;
        result[k] = result[k] && v === target[k];
    });
    return result;
}

var arrayOfObjects = [{ item: { first_name: "Joe", last_name: "Dow", age: 15 } }, { item: { first_name: "Joe", last_name: "d", age: 15 } }, { item: { first_name: "Joe", last_name: "Dow", age: 20 } }],
    result = arrayOfObjects.reduce((r, o, _, [q]) => check(q, o, r), {});

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...