بررسی معادلهای LINQ to Objects در TypeScript
نویسنده: وحید نصیری
تاریخ: ۱۳۹۶/۱۰/۱۱ ۱۳:۵۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
export interface Person {
name: string;
age: number;
} export class LinqTestsComponent {
people: Person[] = [
{ name: "User 4", age: 27 },
{ name: "User 5", age: 42 },
{ name: "User 6", age: 8 },
{ name: "User 1", age: 20 },
{ name: "User 2", age: 35 },
{ name: "User 3", age: 78 }
];
} logTitle(title: string) {
console.log(`%c${title}`, "background: #222; color: #bada55");
}
logOriginalArray() {
console.log(`original this.people:${JSON.stringify(this.people)}`);
}
logResult(message: string, result: any) {
console.log(`${message}:${JSON.stringify(result)}`);
} equivalentToWhere() {
const youngerThan40 = this.people.filter(person => person.age < 40); // ECMAScript 5
this.logResult("People younger than 40", youngerThan40);
// Filtering on Multiple Criteria
const youngsters = this.people.filter(
person => person.age < 40 && person.name.toLocaleLowerCase().indexOf("user") !== -1);
this.logResult("Users younger than 40", youngsters);
} People younger than 40:[
{"name":"User 4","age":27},
{"name":"User 6","age":8},
{"name":"User 1","age":20},
{"name":"User 2","age":35}
]
Users younger than 40:[
{"name":"User 4","age":27},
{"name":"User 6","age":8},
{"name":"User 1","age":20},
{"name":"User 2","age":35}
] equivalentToAny() {
const anyUnder40 = this.people.some(person => person.age < 40); // ECMAScript 5
this.logResult("Are any people under 40?", anyUnder40); // true
// Filtering on Criteria Matching any Object Properties
const filterBy = "user";
const anyUsers = this.people.filter(person =>
Object.keys(person).some(property => {
let value = (<any>person)[property];
if (typeof value === "string") {
value = value.toLocaleLowerCase();
}
return value.toString().indexOf(filterBy) !== -1;
})
);
this.logResult("anyUsers", anyUsers);
} Are any people under 40?:true
anyUsers:[
{"name":"User 4","age":27},
{"name":"User 5","age":42},
{"name":"User 6","age":8},
{"name":"User 1","age":20},
{"name":"User 2","age":35},
{"name":"User 3","age":78}
] equivalentToContains() {
const searchElement: Person = { name: "User 4", age: 27 };
const containsUser4 = this.people.includes(searchElement); // ECMAScript 2016 = ECMAScript 7
this.logResult("Contains searchElement", containsUser4); // false -> only compares by reference and not by value.
const indexOfUser4 = this.people.indexOf(searchElement); // ECMAScript 5
this.logResult("indexOfUser4", indexOfUser4); // -1 -> only compares by reference and not by value.
const stringifiedObj = JSON.stringify(searchElement);
const includesUser4 = this.people.some(person => JSON.stringify(person) === stringifiedObj);
this.logResult("includesUser4", includesUser4); // true -> compares by by value.
} Contains searchElement:false indexOfUser4:-1 includesUser4:true
equivalentToAll() {
const allUnder30 = this.people.every(person => person.age < 30); // ECMAScript 5
this.logResult("Are all people under 30?", allUnder30); // false
} Are all people under 30?:false
equivalentToFirstOrDefault() {
const vahidOrDefault = this.people.filter(item => item.name === "Vahid")[0] || null; // ECMAScript 5
this.logResult("vahidOrDefault", vahidOrDefault);
const user1OrDefault = this.people.find(item => item.name === "User 1") || null; // ECMAScript 2015 = ECMAScript 6
this.logResult("user1OrDefault", user1OrDefault);
} equivalentToFindIndex() {
const index = this.people.findIndex(person => person.age === 8); // ECMAScript 2015 = ECMAScript 6
this.logResult("index of the user with age 8", index)
} index of the user with age 8:2
equivalentToSelect() {
const names = this.people.map(person => person.name); // ECMAScript 5
this.logResult("Selected the names of people", names);
} Selected the names of people:["User 4","User 5","User 6","User 1","User 2","User 3"]
equivalentToAggregate() {
// ECMAScript 5
const aggregate = this.people.reduce((person1, person2) => {
return { name: "", age: person1.age + person2.age };
});
this.logResult("Aggregate age", aggregate.age); // { age: 210 }
} Aggregate age:210
equivalentToForEach() {
// ECMAScript 5
this.people.forEach(person => {
this.logResult("person", person);
});
} person:{"name":"User 4","age":27}
person:{"name":"User 5","age":42}
person:{"name":"User 6","age":8}
person:{"name":"User 1","age":20}
person:{"name":"User 2","age":35}
person:{"name":"User 3","age":78} // ECMAScript 5
let orderedByAgeAscending = this.people.sort((person1, person2) => {
const a = person1.age;
const b = person2.age;
return a > b ? 1 : -1;
});
this.logResult("Ordered by age ascending", orderedByAgeAscending); orderedByAgeAscending = this.people.sort((person1, person2) => person1.age - person2.age);
this.logResult("Ordered by age ascending", orderedByAgeAscending); Ordered by age ascending:[
{"name":"User 6","age":8},
{"name":"User 1","age":20},
{"name":"User 4","age":27},
{"name":"User 2","age":35},
{"name":"User 5","age":42},
{"name":"User 3","age":78}
] const orderedByName = this.people.sort((person1, person2) => {
// name1.localeCompare(name2) // is case insensitive
// or use toUpperCase() to ignore character casing
const name1 = person1.name.toUpperCase();
const name2 = person2.name.toUpperCase();
return name1 > name2 ? 1 : -1;
})
this.logResult("Ordered by name", orderedByName);
this.logOriginalArray(); Ordered by name:[
{"name":"User 1","age":20},
{"name":"User 2","age":35},
{"name":"User 3","age":78},
{"name":"User 4","age":27},
{"name":"User 5","age":42},
{"name":"User 6","age":8}
]
original this.people:[
{"name":"User 1","age":20},
{"name":"User 2","age":35},
{"name":"User 3","age":78},
{"name":"User 4","age":27},
{"name":"User 5","age":42},
{"name":"User 6","age":8}
] chainFunctionCalls() {
const namesOfPeopleOver30OrderedDesc =
this.people
.filter(person => person.age > 30)
.map(person => person.name)
.sort((name1, name2) => {
// name1.localeCompare(name2) // is case insensitive
// or use toUpperCase() to ignore character casing
name1 = name1.toUpperCase();
name2 = name2.toUpperCase();
return name2 > name1 ? 1 : -1;
});
this.logResult("the names of all people over 30 ordered by name descending", namesOfPeopleOver30OrderedDesc);
} the names of all people over 30 ordered by name descending:["User 5","User 3","User 2"]
equivalentToSkip() {
const skip2 = this.people.splice(2); // ECMAScript 5
this.logResult("skip2 -> the deleted elements", skip2);
this.logOriginalArray();
} skip2 -> the deleted elements:[
{"name":"User 3","age":78},
{"name":"User 4","age":27},
{"name":"User 5","age":42},
{"name":"User 6","age":8}
]
original this.people:[
{"name":"User 1","age":20},
{"name":"User 2","age":35}
] let alphas = ["1","2","3","4"] ;
// method 1 - using splice
const index = alphas.findIndex(item=>item == "3"); // or use indexOf("3")
if (index !== -1) {
alphas.splice(index, 1); // array.splice(start, deleteCount)
}
// method 2 - using filter
let newAlphas = alphas.filter(item => item !=="3"); const item = { id: 2, name: 'New AbolfazlR' };
const items = [{ id: 2, name: 'AbolfazlR' }, { id: 3, name: 'AndyM' }, { id: 4, name: 'DarushE' }];
const foundIndex = items.findIndex(x => x.id === item.id);
items[foundIndex] = item;
// خروجی
// 0:{id: 2, name: "New AbolfazlR"}
// 1:{id: 3, name: "AndyM"}
// 2:{id: 4, name: "DarushE"} var maleNames = people .Where(p => p.Sex == "M") .Select(p => p.Name)
var maleNames = $.grep(people, function (p) { return p.Sex == 'M'; })
.map(function (p) { return p.Name; });