Mam poniżej dwie tablice obiektów

var array_1 = [{"Date": "2020-04-01", "Item" : 001},{"Date": "2020-04-03", "Item" : 002}]
var base_array = [{"Date": "2020-04-01", "Item" : null}, {"Date": "2020-04-02", "Item" : null}, 
                  {"Date": "2020-04-04", "Item" : null}]

Planuję zmodyfikować tablicę 1, jak poniżej

 var array_1 = [{"Date": "2020-04-01", "Item" : 001},
                {"Date": "2020-04-02", "Item" : null},
                {"Date": "2020-04-03", "Item" : 002},
                {"Date": "2020-04-04", "Item" : null}]

Ponieważ data „2020-04-02” i „2020-04-04” nie istnieją w tablicy_1, te daty powinny być wypychane z wartością „item” null, a „2020-04-01” nie powinno być wypychane, ponieważ istnieje już w tablicy_1 .

Próbowałem wykonać każdą pętlę, ale nie mogłem kontynuować

Mała uwaga: tablica_bazowa zawsze będzie zawierać większą wartość niż tablica_1. więc dlatego użyłem base_array jako mojej początkowej pętli

$.each(base_array , function (key,bvalue) {

    $.each(array_1, function (key,value) {
          if(bvalue.Date != value.Date){

               array_1.push({"Date" : value.Date, "Item": value.Item})
          }
    })
})
1
Elite user 3 kwiecień 2020, 09:31

5 odpowiedzi

Najlepsza odpowiedź

Możesz użyć Array.reduce() on base_array, przekazując array_1 jako wartość początkową i dodając tylko wartości z base_array, gdzie Date nie istnieje już w wartości przeniesienia:

var array_1 = [{
  "Date": "2020-04-01",
  "Item": 001
}, {
  "Date": "2020-04-03",
  "Item": 002
}];
var base_array = [{
    "Date": "2020-04-01",
    "Item": null
  }, {
    "Date": "2020-04-02",
    "Item": null
  },
  {
    "Date": "2020-04-04",
    "Item": null
  }
];

array_1 = base_array.reduce((c, v) => c.concat(c.some(e => e.Date == v.Date) ? [] : [v]), array_1);
console.log(array_1);
2
Nick 3 kwiecień 2020, 06:43

Najpierw usuń z base_array elementy, które już są w array_1, używając filter. Następnie concat.

var array_1 = [{"Date": "2020-04-01", "Item" : 001},{"Date": "2020-04-03", "Item" : 002}]
var base_array = [{"Date": "2020-04-01", "Item" : null}, {"Date": "2020-04-02", "Item" : null}, {"Date": "2020-04-04", "Item" : null}]
                  
var filtered = base_array.filter(({Date}) => !array_1.some(el => el.Date == Date));
var result = array_1.concat(filtered);
console.log(result);
1
ariel 3 kwiecień 2020, 06:54

Możesz użyć prostej pętli i znaleźć pozycję wstawiania za pomocą porównania.

var array_1 = [{
  "Date": "2020-04-01",
  "Item": 001
}, {
  "Date": "2020-04-03",
  "Item": 002
}]
var base_array = [{
    "Date": "2020-04-01",
    "Item": null
  }, {
    "Date": "2020-04-02",
    "Item": null
  },
  {
    "Date": "2020-04-04",
    "Item": null
  }
]

// iterate over second array
base_array.forEach(el => {
  for (let i = 0; i < array_1.length; i++) {
    // if value found return
    if (array_1[i].Date === el.Date) return;
    // if position found, insert and return
    if (array_1[i].Date > el.Date) {
      array_1.splice(i, 0, el);
      return
    }
  }
  // or insert at the end of the array
  array_1.push(el);
})

console.log(array_1);

UWAGA: Zakładając, że pierwsza tablica jest zawsze posortowana.


AKTUALIZACJA: Lub jeśli kolejność może się zmienić i nie chcesz ich dodawać na końcu, możesz użyć Array#some i Array#filter.

var array_1 = [{
  "Date": "2020-04-01",
  "Item": 001
}, {
  "Date": "2020-04-03",
  "Item": 002
}]
var base_array = [{
    "Date": "2020-04-01",
    "Item": null
  }, {
    "Date": "2020-04-02",
    "Item": null
  },
  {
    "Date": "2020-04-04",
    "Item": null
  }
]

array_1.push(...base_array.filter(o => array_1.every(o1 => o1.Date !== o.Date)))

console.log(array_1);
1
Pranav C Balan 5 kwiecień 2020, 13:45

Nie jestem pewien, czy zamówienie miało dla Ciebie znaczenie, ale jeśli nie, oto jedno rozwiązanie

// Keep track of all dates already present in `array_1`.
let array_1_dates = new Set(array_1.map(array_1_elem => array_1_elem.Date));

// Push elements from `base_array` that are not in `array_1`.
for (let base_array_elem of base_array) {
  if (!array_1_dates.has(base_array_elem.Date)) {
    array_1.push(base_array_elem);
  }
}
1
jonathanGB 3 kwiecień 2020, 06:46

Możesz wziąć tablicę skrótów, przypisać obiekt do tej samej daty i uzyskać tablicę obiektów.

Na koniec posortuj tablicę według Date.

var array_1 = [{ Date: "2020-04-01", Item: "001" }, { Date: "2020-04-03", Item: "002" }],
    base_array = [{ Date: "2020-04-01", Item: null }, { Date: "2020-04-02", Item: null }, { Date: "2020-04-04", Item: null }],
    result = Object
        .values([...base_array, ...array_1].reduce((r, o) => (r[o.Date] = o, r), {}))
        .sort(({ Date: a }, { Date: b }) => a > b || -(a < b))

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2
Nina Scholz 3 kwiecień 2020, 06:49