Ich habe eine Reihe von Objekten wie diese:
[ {"name": "Apple", "id": "Apple_0"},
{"name": "dog", "id": "dog_1"},
{"name": "cat", "id": "cat_2"}
]
Ich möchte ein anderes Element einfügen, auch Apple
genannt. Da ich jedoch keine Duplikate darin haben möchte. Wie kann ich mit lodash feststellen, ob sich bereits ein Objekt im Array mit demselben Namen befindet?
Dies hat bei mir funktioniert (nachdem ich die verschiedenen Lösungen getestet hatte):
addItem(items, item) {
let foundObject = _.find(items, function(e) {
return e.value === item.value;
});
if(!foundObject) {
items.Push(item);
}
return items;
}
Sie können Lodash _.find()
so verwenden.
var data = [ {"name": "Apple", "id": "Apple_0"},
{"name": "dog", "id": "dog_1"},
{"name": "cat", "id": "cat_2"}
]
if(!_.find(data, {name: 'Apple'})) {
data.Push({name: 'Apple2'});
}
console.log(data)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
Das ist Formular
_.has(object, path)
Beispiel:
const countries = { country: { name: 'Venezuela' } }
const isExist = _.has(countries, 'country.name')
// isExist = true
Weitere Informationen Document Lodash
Sie können Array.prototype.find()
oder lodash's _.find()
verwenden:
const addItem = (arr, item) => {
if(!arr.find((x) => x.name === item.name)) { // you can also change `name` to `id`
arr.Push(item);
}
};
const arr = [
{"name": "Apple", "id": "Apple_0"},
{"name": "dog", "id": "dog_1"},
{"name": "cat", "id": "cat_2"}
];
addItem(arr, { "name": "Apple", "id": "Apple_0" });
addItem(arr, { "name": "pear", "id": "pear_3" });
console.log(arr);
Und eine etwas kürzere, aber weniger lesbare Version:
const addItem = (arr, item) => arr.find((x) => x.name === item.name) || arr.Push(item); // you can also change `name` to `id`
const arr = [
{"name": "Apple", "id": "Apple_0"},
{"name": "dog", "id": "dog_1"},
{"name": "cat", "id": "cat_2"}
];
addItem(arr, { "name": "Apple", "id": "Apple_0" });
addItem(arr, { "name": "pear", "id": "pear_3" });
console.log(arr);
Hier ist ein anderes Beispiel mit lodash
var a = [ {"name": "Apple", "id": "Apple_0"},
{"name": "dog", "id": "dog_1"},
{"name": "cat", "id": "cat_2"}
]
var b = _.find(a, ['name', "Apple2"]);
if(_.isObject(b)){
console.log('exists')
}else{
console.log('insert new')
}
Wenn Sie nur einen Wert in das Array einfügen möchten, könnte _.find
eine Option sein. Wenn Sie jedoch Interesse haben, eine oder mehrere davon einzufügen, würde ich stattdessen die Verwendung von _.unionBy
vorschlagen:
var currentArr = [{
"name": "Apple",
"id": "Apple_0"
}, {
"name": "dog",
"id": "dog_1"
}, {
"name": "cat",
"id": "cat_2"
}],
arrayOneValue = [{
"name": "Apple",
"id": "Apple_0"
}],
arrayTwoValues = arrayOneValue.concat({
"name": "lemon",
"id": "lemon_0"
})
console.log(_.unionBy(currentArr, arrayOneValue, 'name'));
console.log(_.unionBy(currentArr, arrayTwoValues, 'name'));
// It also allow you to perform the union using more than one property
console.log(_.unionBy(currentArr, arrayTwoValues, 'name', 'id'));
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>
Es gibt drei Möglichkeiten, dies mit lodash
4.17.5
zu erreichen:
Angenommen, Sie möchten das Objekt entry
zu einem Array von Objekten numbers
hinzufügen, nur wenn entry
noch nicht vorhanden ist.
let numbers = [
{ to: 1, from: 2 },
{ to: 3, from: 4 },
{ to: 5, from: 6 },
{ to: 7, from: 8 },
{ to: 1, from: 2 } // intentionally added duplicate
];
let entry = { to: 1, from: 2 };
/*
* 1. This will return the *index of the first* element that matches:
*/
_.findIndex(numbers, (o) => { return _.isMatch(o, entry) });
// output: 0
/*
* 2. This will return the entry that matches. Even if the entry exists
* multiple time, it is only returned once.
*/
_.find(numbers, (o) => { return _.isMatch(o, entry) });
// output: {to: 1, from: 2}
/*
* 3. This will return an array of objects containing all the matches.
* If an entry exists multiple times, if is returned multiple times.
*/
_.filter(numbers, _.matches(entry));
// output: [{to: 1, from: 2}, {to: 1, from: 2}]
/*
* 4. This will return `true` if the entry exists, false otherwise.
*/
_.some(numbers, entry);
// output: true
Wenn Sie eine Boolean
zurückgeben möchten (d. H. Vorausgesetzt, Sie verwenden _.some()
nicht), können Sie im ersten Fall einfach den zurückgegebenen Indexwert überprüfen:
_.findIndex(numbers, (o) => { return _.isMatch(o, entry) }) > -1;
// output: true
Lodash
Dokumentation ist eine großartige Quelle für Beispiele und Experimente.